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

时间:2016-06-15 17:52:09

标签: c++ io int byte endianness

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

我可以这样读取数据:

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

但是我如何将缓冲区数组转换为相应的int值955?如果可能的话,以endianness独立的方式,因为这和Big Endian字节顺序中的其他文件,但我的系统是Little Endian字节顺序。谢谢:))

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

无需使用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。如果你需要独立的代码,你需要自己创建(可能在这些编译器内在函数之上)。

答案 2 :(得分:1)

如果您的操作系统支持POSIX或是Windows,那么您可以使用ntohl

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