我需要阅读在Little-endian OS上编写的二进制文件。提取运算符<
#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));
最佳答案
我是否只需要在big-endian机器上交换字节?
The machine doesn't matter。 C ++整数是数字,而不是字节序列。毫不奇怪,字节序列具有字节顺序(又称为字节序)属性。数字没有。 5是5是5是5是V是IIIII是101是12。
您希望从其表示形式中获得一个数字,该数字是按字节序排列的,其顺序为little-endian字节。 C ++有一个简单的方法可以做到这一点:
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
这适用于任何计算机,因为C ++整数是任何计算机上的数字。
对于浮点数,您需要知道如何进行编码。字节顺序属性不足以描述这一点。在大多数主流实现中,您可以假定它们按照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++中读取二进制文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23871829/