我需要阅读在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/

10-12 03:01