大端和字节顺序小端支持(Big Endian and Little Endian support f

2019-09-24 06:32发布

我们需要支持3个硬件平台 - 窗口(小端)和嵌入式Linux(大和little endian)。 我们的数据流取决于它使用的机器和数据需要被分成位字段。

我想编写一个宏(如果可能)抽象掉的细节。 在Linux上,我可以使用bswap_16 / bswap_32 / bswap_64小端转换。

不过,我不能在我的Visual C发现这++包括。

有没有一个通用的内置两个平台(Windows和Linux)?

如果没有,那么我能在Visual C ++用来做字节交换(不是写我自己其他 - 希望一些机优化的内置式)?

谢谢。

Answer 1:

在你有两个平台

对于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上这种方法可能是“最好的” 。



Answer 2:

不一样的名字,但相同的功能确实存在 。



Answer 3:

htons和htonl(以及类似宏)如果你坚持处理字节性都不错。

然而,这是更好的通过ASCII或类似的输出数据来回避这个问题。 它需要多一点的房间,多一点慢慢地传递过网,但简单和futureproofing是值得的。

另一种选择是数字拆开你的INT的和短期的。 所以,你和256多次0xFF和鸿沟。 这使得在所有的架构单一格式。 但ASCII的仍然有优势,因为它更容易与调试。



文章来源: Big Endian and Little Endian support for byte ordering