Big Endian和Little Endian支持字节排序

use*_*201 5 c c++ linux endianness visual-c++

我们需要支持3个硬件平台--Windows(小端)和Linux嵌入式(大端和小端).我们的数据流依赖于它使用的机器,数据需要分解为位字段.

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

但是,我在Visual C++中找不到这个包含.

两个平台(Windows和Linux)都有通用的内置功能吗?

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

谢谢.

alk*_*alk 12

在这两个平台上你都有

对于short(16位):htons()ntohs()

for long(32bit):htonl()ntohl()

缺失htonll()ntohll()long long(64位),可以很容易地从这两建设.例如,请参阅此实现.

更新0:

对于上面链接的示例,Simon Richter在评论中提到,它不一定必须起作用.原因是:编译器可能会在使用的联合中的某处引入额外的字节.要解决这个问题,工会需要打包.后者可能会导致性能下降.

所以这是另一种构建*ll功能的故障安全方法:https://stackoverflow.com/a/955980/694576

更新0.1:

从bames53的评论中我倾向于得出结论,上面链接的第一个例子不能与C++一起使用,而只能用C语言.

更新1:

为了实现*llLinux上函数的功能,这种方法可能是"最好的".