6

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

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

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

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

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

谢谢。

4

3 回答 3

13

在这两个平台上你都有

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

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

缺少的htonll()ntohll()for long long(64bit) 可以很容易地从这两个构建。例如,请参阅此实现

更新-0:

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

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

更新-0.1:

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

更新 1:

*ll在 Linux 上实现功能的功能,这种方法可能是“最好的”

于 2012-10-18T17:23:38.057 回答
2

名称不同,但功能相同。

编辑:存档链接-> https://web.archive.org/web/20151207075029/http://msdn.microsoft.com/en-us/library/a3140177(v=vs.80).aspx

_byteswap_uint64、_byteswap_ulong、_byteswap_ushort

于 2012-10-18T17:23:54.283 回答
2

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

但是,最好通过以 ASCII 或类似格式输出数据来回避这个问题。它需要更多的空间,并且在网络上传输的速度更慢一些,但是简单和面向未来是值得的。

另一种选择是在数字上拆开你的 int 和 short's。所以你 & 0xff 并反复除以 256。这为所有架构提供了单一格式。但是 ASCII 仍然具有优势,因为它更易于调试。

于 2012-10-18T21:24:20.820 回答