Big Endian和Little Endian支持字节sorting

我们需要支持3个硬件平台–Windows(小端)和Linux Embedded(大端和小端)。 我们的数据stream取决于它使用的机器,数据需要分解成位域。

我想写一个macros(如果可能的话)来抽象出细节。 在Linux上,我可以使用bswap_16 / bswap_32 / bswap_64进行Little Endian转换。

但是,我无法在我的Visual C ++包含中find这个。

是否有两个平台(Windows和Linux)的通用内置?

如果没有,那么我可以在Visual C ++中使用什么来做字节交换(除了自己写的 – 希望一些机器优化的内置)?

谢谢。

Solutions Collecting From Web of "Big Endian和Little Endian支持字节sorting"

在两个平台上都有

(16bit): htons()ntohs()

long (32位): htonl()ntohl()

long long (64位)缺少htonll()ntohll() )可以很容易地从这两个建立。 例如见这个实现 。

更新0:

西蒙·里希特(Simon Richter)在上面提到的一个例子中提到,它不一定要工作。 原因是:编译器可能会在所使用的联合中的某处引入额外的字节。 为了解决这个问题,工会需要打包。 后者可能导致性能损失。

所以这里有另一种自动安全的方法来构建*ll函数: https : //stackoverflow.com/a/955980/694576

更新0.1:

从bames53的评论中,我倾向于总结上面的第一个例子不能用于C ++,而只用C。

更新1:

为了在Linux上实现函数的功能, 这个方法可能是最好的 。

不一样的名字,但是相同的功能确实存在 。

htons和htonl(以及类似的宏)很好,如果你坚持处理字节性。

但是,通过以ASCII或类似方式输出数据来避免这个问题要好得多。 它需要更多的空间,它通过网络传输更慢一点,但简单和未来的防护是值得的。

另一种选择是数字拆分你的int和short。 所以你&0xff反复除以256。 这给所有架构上的单一格式。 但ASCII仍然有优势,因为它更容易调试。