我们需要支持3个硬件平台- Windows (小端)和Linux Embedded (大端和小端)。我们的数据流依赖于它所使用的机器,并且需要将数据分解为位字段。
我想写一个宏(如果可能的话)来抽象出细节。在Linux上,我可以使用bswap_16/bswap_32/bswap_64进行小端转换。
然而,我在我的可视化C++包含中找不到它。
是否有两个平台(Windows和Linux)的通用内置?
如果不是,那么我可以在Visual C++中使用什么来进行字节交换(除了自己编写它-希望有一些机器优化的内置代码)?
谢谢。
发布于 2012-10-19 01:23:38
在这两个平台上都有
对于short (16位):htons()和ntohs()
对于long (32位):htonl()和ntohl()
缺少的用于long long (64位)的htonll()和ntohll()可以很容易地从这两者中构建出来。参见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函数的功能。
发布于 2012-10-19 01:23:54
不是相同的名称,但相同的功能可以使用exist。
_byteswap_uint64、_byteswap_ulong、_byteswap_ushort
发布于 2012-10-19 05:24:21
如果您坚持处理字节性别,htons和htonl (以及类似的宏)是很好的。
但是,最好是通过以ASCII或类似格式输出数据来回避这个问题。它占用了更多的空间,在网络上传输的速度也慢了一点,但它的简单性和未来性是值得的。
另一种选择是用数字将int和short分开,这样& 0xff就会被256重复除。这在所有架构上都提供了单一的格式。但ASCII仍然具有优势,因为它更易于调试。
https://stackoverflow.com/questions/12960226
复制相似问题