我们需要支持3个硬件平台--Windows(小端)和Linux嵌入式(大端和小端)。我们的数据流依赖于它使用的机器,数据需要分解为位字段。
我想编写一个宏(如果可能的话)来抽象出细节。在Linux上,我可以使用bswap_16
/ bswap_32
/ bswap_64
进行Little Endian转换。
但是,我在Visual C ++中找不到这个。
两种平台(Windows和Linux)都有通用内置功能吗?
如果没有,那么我可以在Visual C ++中使用什么来进行字节交换(除了自己编写 - 希望某些机器优化内置)?
感谢。
答案 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仍然有优势,因为它更容易调试。