我们需要支持3个硬件平台 - 窗口(小端)和嵌入式Linux(大和little endian)。 我们的数据流取决于它使用的机器和数据需要被分成位字段。
我想编写一个宏(如果可能)抽象掉的细节。 在Linux上,我可以使用bswap_16
/ bswap_32
/ bswap_64
小端转换。
不过,我不能在我的Visual C发现这++包括。
有没有一个通用的内置两个平台(Windows和Linux)?
如果没有,那么我能在Visual C ++用来做字节交换(不是写我自己其他 - 希望一些机优化的内置式)?
谢谢。
在你有两个平台
对于short
(16位): htons()
和ntohs()
对于long
(32位): htonl()
和ntohl()
缺少htonll()
和ntohll()
的long long
(64位),可以很容易地从这两建设。 见例如此实现 。
更新0:
对于以上西蒙·里克特链接的例子提到了一个评论,它不一定有工作。 这样做的原因是:编译器可能会在使用的工会某处引入额外的字节。 要解决此工会需要打包。 后者可能会导致性能损失。
因此,这里的另一个故障安全的方法来构建*ll
功能: https://stackoverflow.com/a/955980/694576
更新0.1:
从bames53的评论我倾向于断定上面链接不得与C ++中使用的第一个例子,但只有温度。
更新1:
为了实现对后的功能*ll
功能在Linux上这种方法可能是“最好的” 。
htons和htonl(以及类似宏)如果你坚持处理字节性都不错。
然而,这是更好的通过ASCII或类似的输出数据来回避这个问题。 它需要多一点的房间,多一点慢慢地传递过网,但简单和futureproofing是值得的。
另一种选择是数字拆开你的INT的和短期的。 所以,你和256多次0xFF和鸿沟。 这使得在所有的架构单一格式。 但ASCII的仍然有优势,因为它更容易与调试。