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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13001183/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 16:52:23  来源:igfitidea点击:

How to read little endian integers from file in C++?

c++cbinarybinaryfiles

提问by user1713700

Say I have a binary file; it contains positive binary numbers, but written in little endianas 32-bit integers

假设我有一个二进制文件;它包含正二进制数,但以小端字节序写成 32 位整数

How do I read this file? I have this right now.

我如何阅读这个文件?我现在有这个。

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;
}

回答by Vaughn Cato

This is one way to do it that works on either big-endian or little-endian architectures:

这是一种适用于大端或小端架构的方法:

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;
}

回答by Kylo

If you are using linux you should look here;-)

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

It is about useful functions such as le32toh

关于le32toh等有用的功能

回答by Reunanen

From CodeGuru:

来自CodeGuru

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

So, you can read directly to unsigned intand then just call this.

所以,你可以直接读取unsigned int,然后调用它。

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