C ++如何将字节读取为独立于整数字节序的?

C++ How to read Bytes as Integer endianness independent?

我想读取文件的一些字节作为整数值。例如,文件包含等于 955 的值 0x000003BB

我可以这样读取数据:

ifstream input ("C:/Desktop/myFile", ios::binary);
uint8_t buffer[4] = {0};
input.read((char*)buffer, sizeof(buffer));

但是如何将缓冲区数组转换为相应的整数值 955?如果可能的话,以一种独立于字节序的方式,因为这个文件和其他一些文件是大字节序的,但我的系统是小字节序的。谢谢:)

我不确定这是最好的解决方案,但它确实有效。

uint8_t buffer[4] = {0};
input.read((char*)buffer, sizeof(buffer));
unsigned int result = buffer[0];
result = (result << 8) | buffer[1];
result = (result << 8) | buffer[2];
result = (result << 8) | buffer[3];

不需要使用uint8_t的数组,直接读入一个4字节整数即可:

uint32_t data;
input.read((char*)&data, sizeof(data));

编辑:

此代码适用于我的 VC++ 编译器:

#include<stdint.h>
#include<intrin.h>
#include<iostream>

int main()
{
    uint32_t data;
    data = 0xBB030000;
    data = _byteswap_ulong(data);

    std::cout << data;
}

如果您使用的是 GCC,则需要将 _byteswap_ulong 替换为 __builtin_bswap32。如果您需要独立代码,则需要自己编写代码(可能在这些编译器内部函数之上)。

如果您的 OS 支持 POSIX 或者是 windows,那么您可以使用 ntohl:

int data;
input >> data;
data = ntohl(data);