我需要读取在小端操作系统上编写的二进制文件。提取运算符 << 不适用于二进制文件。似乎按照下面的代码行进行简单的实现可以在运行在 Intel 芯片上的 Mac OS X 上运行。我只是想知道犹太洁食是怎样的。我是否只需要在大端机器上交换字节?
#include <istream>
#include <cstdint>
...
std::stream sfile(path, std::ios::binary);
...
uint32_t iValue;
sfile.read(reinterpret_cast<char *>(&iValue), sizeof(uint32_t));
double dValue;
sfile.read(reinterpret_cast<char *>(&dValue), sizeof(double));
最佳答案
Would I just need to swap bytes on big-endian machines?
The machine doesn't matter . C++ 整数是数字,而不是字节序列。毫不奇怪,字节序列具有字节顺序(又名字节顺序)属性。数字没有。五是五是五是五是五是五是三三是101是12.
您想从其表示形式中获取一个数字,作为具有小端字节顺序的字节序列。 C++ 有一个简单的方法来做到这一点:
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
这适用于任何机器,因为 C++ 整数在任何机器上都是数字。
对于 float ,您需要知道它们是如何编码的。字节顺序属性不足以描述这一点。在大多数主流实现中,您可以假设它们是按照 IEEE754 标准中指定的方式进行编码的。要读取这些实现中的一个,您可以从适当的字节顺序构造一个整数,然后按位将其复制到一个浮点变量中,如下所示:
uint32_t i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
float f; // assumes IEEE754 single-precision
std::memcpy(&f, &i, sizeof(i));
关于c++ - 一种在 C++ 中读取二进制文件的 Kosher 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23871829/