Big Endian和Little Endian支持字节排序

时间:2012-10-18 17:20:17

标签: c++ c linux visual-c++ endianness

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

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

但是,我在Visual C ++中找不到这个。

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

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

感谢。

3 个答案:

答案 0 :(得分:12)

在两个平台上都有

代表short(16位):htons()ntohs()

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

htonll()(64位)的遗失ntohll()long long可以轻松地从这两个版本构建。请参阅this implementation for example

<强>更新-0:

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

所以这是构建*ll函数的另一种自动防故障方法:https://stackoverflow.com/a/955980/694576

<强>更新-0.1:

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

<强>更新-1:

实现Linux this approach might be the ' best'*ll函数的功能。

答案 1 :(得分:2)

名称不同,但exist具有相同的功能。

答案 2 :(得分:2)

如果你坚持处理字节性问题,那么

htons和htonl(以及类似的宏)是好的。

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

另一种选择是数字化拆分你的int和short。所以你&amp; 0xff并重复除以256。这为所有体系结构提供了单一格式。但是ASCII仍然有优势,因为它更容易调试。