【发布时间】:2012-12-02 14:39:05
【问题描述】:
我需要能够从 C++ 中的二进制数据中读取浮点数或双精度数,类似于 Python 的 struct.unpack 函数。我的问题是我收到的数据总是大端的。我已经处理了整数值as described here 的问题,但是逐字节工作不适用于浮点值。我需要一种在 C++ 中提取浮点值(32 位 floats 和 64 位 doubles)的方法,类似于在 Python 中使用 struct.unpack(">f", num) 或 struct.unpack(">d", num) 的方式。
这是我尝试过的一个示例:
stuct.unpack("d", num) ==> *(double*) str; // if str is a char* containing the data
如果str 是 little-endian 则效果很好,但如果它是 big-endian 则不行,因为我知道它将永远如此。问题是我不知道环境的原生字节序是什么,所以我需要能够随时将二进制数据提取为大字节序。
如果您查看链接的问题,您会发现这很容易对整数值使用按位或位移,但该方法不适用于浮点。
注意我应该早点指出这一点,但我不能使用 c++11 或 Boost 以外的任何第三方库。
【问题讨论】:
-
stackoverflow.com/questions/5242589/… 这个问题已经被覆盖了
-
你尝试过什么?有什么区别?演员表?
-
我可能会建议使用某种消息打包库(MessagePack、Protobufs、Thrift 等)而不是尝试手动执行此操作...这几乎会让你秃头和这些库使这类事情变得非常琐碎......
-
@kassak 这如何回答我的问题?问题不是“它会受到影响吗?”。显然是这样,因为我遇到了这个问题。问题是“我该如何解决?”
-
如果字节序不同,那么您是在两种不同类型的机器之间交谈。浮点格式具有更多变量,而不仅仅是机器类型之间的字节序。
标签: c++ python floating-point binary endianness