【问题标题】:C library function to convert binary byte array to integer with various conversionsC 库函数通过各种转换将二进制字节数组转换为整数
【发布时间】:2011-05-20 16:26:39
【问题描述】:

是否有一组 C 库函数(或在某处收集的非库函数)允许通过各种转换(大端数据、小端数据、一个补码签名、二进制补码)将字节数组数据转换为整数签名等),考虑到机器自身的字节顺序?

谢谢!

【问题讨论】:

  • 你能解释一下 htonl() 和朋友 + 投射不能解决你的问题吗?
  • htonl() 没有严格定义其输入或输出的结束性。如果有严格定义的标准,请告诉我。强制转换不是一个可行的解决方案,因为有符号和无符号数据之间的转换依赖于架构,而数据可能会在架构之间移动。在我的脑海中,我看到了一个这样的函数:convert_data(buffer, BIG_ENDIAN | TWO_COMPLEMENT)。
  • 所以你有一个未定义的数据传输机制(因此 htonl 不会有帮助),但是数据格式/容器告诉你它是如何存储的,你正在寻找一个可以转换它的库.一个都不知道。想了一会儿xparam,但看起来你已经有了一个容器/序列化。
  • 是的,这是一个相当准确的描述。数据由第三方存储在文件中,我无法更改格式,可能会有所不同,并由第三方指定。

标签: c binary endianness


【解决方案1】:

这很接近,尽管我认为它不会处理一个补码与二元补码。您也许可以添加它。 http://code.google.com/p/protobuf-c/

【讨论】:

  • 仔细阅读后,似乎此代码最适合重新加载以前使用相同代码保存的数据的情况。
【解决方案2】:

据我了解,您试图获得一个明确的 BIG_ENDIAN(或 LITTLE_ENDIAN)号码,而不必知道您当前主机的约定是什么。这应该是可能的。

据我所知,按照惯例,“网络字节顺序”总是 BIG_ENDIAN。所以你可以调用htonx(),然后你就知道它是BIG_ENDIAN。然后,如果您想要 LITTLE_ENDIAN,您可以在自己的代码中手动转置字节。结果应该是您自己的 toBigEndian() 或 toLittleEndian() 函数。

问题的 2 的补码部分不承认同一件事,因为这完全是惯例问题。假设这个数字是两个字节长 - 几乎每个 16 位值的组合都是有效的 1 的补码,也是有效的 2 的补码。 “正确”值完全取决于编写该值的代码对其的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2013-09-09
    • 2013-07-17
    • 2013-11-08
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多