【问题标题】:Big Endian and Little Endian support for byte orderingBig Endian 和 Little Endian 支持字节排序
【发布时间】:2012-10-09 05:46:00
【问题描述】:

我们需要支持 3 个硬件平台 - Windows(小端)和 Linux Embedded(大端和小端)。我们的数据流依赖于它使用的机器,并且需要将数据分解为位域。

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

但是,我在我的 Visual C++ 包含中找不到这个。

是否有适用于两个平台(Windows 和 Linux)的通用内置插件?

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

谢谢。

【问题讨论】:

    标签: c++ c linux visual-c++ endianness


    【解决方案1】:

    在这两个平台上你都有

    对于short(16 位):htons()ntohs()

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

    long long(64 位)缺少的 htonll()ntohll() 可以很容易地从这两个构建。见this implementation for example

    Update-0:

    对于上面链接的示例 Simon Richter 在评论中提到,它不一定必须工作。这样做的原因是:编译器可能会在使用的联合中的某处引入额外的字节。为了解决这个问题,工会需要被打包。后者可能会导致性能损失。

    因此,这是构建 *ll 函数的另一种故障安全方法:https://stackoverflow.com/a/955980/694576

    Update-0.1:

    根据 bames53 的评论,我倾向于得出结论,上面链接的第一个示例不应与 C++ 一起使用,而只能与 C 一起使用。

    更新 1:

    在Linux上实现*ll函数this approach might be the ' best'的功能。

    【讨论】:

    • 这些功能对于任何理解网络(即互联网)的操作系统来说都是相对通用的。一些最现代的操作系统。
    • 请注意,他们使用union 的示例实现不能保证工作。
    • 是的,你说得对,工会应该被打包。感谢您指出了这一点。请参阅我的答案的更新。 @SimonRichter
    • 使用这样的联合的问题不仅仅是打包。在 C++ 中使用这样的联合是未定义的行为;例如,优化器可以合法地将union { int x, y; } u; u.x = 5; return u.y; 转换为return 0;
    • [class.union] 9.5/1,或者this question有更详尽的解释。
    【解决方案2】:

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

    但是,最好通过以 ASCII 或类似格式输出数据来回避这个问题。它需要更多的空间,并且在网络上传输的速度也更慢一些,但它的简单性和面向未来的设计是值得的。

    另一种选择是以数字方式将 int 和 short 分开。所以你 & 0xff 并反复除以 256。这为所有架构提供了单一格式。但是 ASCII 仍然具有优势,因为它更易于调试。

    【讨论】:

    • 很想这样做,但我们不控制传输。它是从特殊硬件设备读取的数据,需要从那里处理字节。
    【解决方案3】:

    exist 的名称不同,但功能相同。

    编辑:存档链接 -> https://web.archive.org/web/20151207075029/http://msdn.microsoft.com/en-us/library/a3140177(v=vs.80).aspx

    _byteswap_uint64、_byteswap_ulong、_byteswap_ushort

    【讨论】:

    猜你喜欢
    • 2010-10-16
    • 2022-12-12
    • 2019-06-30
    • 2020-12-01
    • 2018-05-15
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多