如何在C++中从文件中读取小端整数?

use*_*700 13 c c++ binary binaryfiles

说我有一个二进制文件; 它包含正二进制数,但以小端编写为32位整数

我该如何阅读此文件?我现在有这个.

int main() {
    FILE * fp;
    char buffer[4];
    int num = 0;
    fp=fopen("file.txt","rb");
    while ( fread(&buffer, 1, 4,fp) != 0) {

        // I think buffer should be 32 bit integer I read,
        // how can I let num equal to 32 bit little endian integer?
    }
    // Say I just want to get the sum of all these binary little endian integers,
    // is there an another way to make read and get sum faster since it's all 
    // binary, shouldnt it be faster if i just add in binary? not sure..
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Vau*_*ato 17

这是一种适用于big-endian或little-endian架构的方法:

int main() {
    unsigned char bytes[4];
    int sum = 0;
    FILE *fp=fopen("file.txt","rb");
    while ( fread(bytes, 4, 1,fp) != 0) {
        sum += bytes[0] | (bytes[1]<<8) | (bytes[2]<<16) | (bytes[3]<<24);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您读取的数字为负数,这在技术上是未定义的行为,可以通过强制转换“(unsigned) bytes[3] &lt;&lt; 24”来避免这种情况。 (2认同)

Kyl*_*ylo 9

如果你使用的是linux,你应该看看这里 ;-)

它是关于有用的功能,如le32toh


Reu*_*nen 5

CodeGuru

inline void endian_swap(unsigned int& x)
{
    x = (x>>24) | 
        ((x<<8) & 0x00FF0000) |
        ((x>>8) & 0x0000FF00) |
        (x<<24);
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以直接阅读unsigned int然后调用它。

while ( fread(&num, 1, 4,fp) != 0) {
    endian_swap(num); 
    // conversion done; then use num
}
Run Code Online (Sandbox Code Playgroud)