2012-10-18 37 views
5

我们需要支持3个硬件平台 - Windows(小端)和Linux嵌入式(大小端)。我们的数据流取决于它使用的机器,数据需要分解成位域。Big Endian和Little Endian支持字节排序

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

但是,我无法在我的Visual C++包含中找到它。

是否有两种平台(Windows和Linux)的通用内置?

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

谢谢。

回答

12

在你有

short(16位)两个平台:htons()ntohs()

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

的失踪long long(64位)htonll()ntohll()可能很容易从这两个建立。见this implementation for example

更新0:

对于上述西蒙·里克特链接的例子提到了一个评论,它不一定有工作。原因是:编译器可能会在所使用的联合中的某处引入额外的字节。要解决这个问题,工会需要打包。后者可能会导致性能下降。

所以这里的另一个故障安全的方法来构建*ll功能:https://stackoverflow.com/a/955980/694576

更新-0.1:

从bames53的评论我倾向于断定上面链接一日例如不得使用与C++,但只有C。

更新-1:

要实现的功能*ll后的功能在Linux上this approach might be the ' best'

+0

这些功能对于理解网络(即互联网)的任何操作系统都是相对通用的。一些最现代的操作系统。 –

+0

请注意,他们使用'union'的示例实现不能保证能够正常工作。 –

+0

是的,你是对的工会应该打包。感谢您指出了这一点。请参阅我的答案更新。 @SimonRichter – alk

2

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

但是,通过以ASCII或类似方式输出数据来避开问题要好得多。它需要更多的空间,它通过网络传输更慢一点,但简单和未来的防护是值得的。

另一种选择是数字拆分你的int和short。所以你& 0xff反复除以256。这为所有体系结构提供了单一格式。但ASCII仍然有优势,因为它更容易调试。

+0

很想做到这一点,但我们不控制传输。它是从一个特殊的硬件设备读入的数据,需要从那里处理字节。 – user626201