在C ++中从big-endian二进制文件中检索int的“正确”方法

时间:2011-11-18 19:54:46

标签: c++ binary int endianness

我有一个big-endian格式的二进制文件,我从中检索2位和4位整数数据。我正在运行的机器是小端的。

有没有人有任何关于从已知格式二进制文件中提取整数数据并在运行时切换字节顺序的建议或最佳做法?我不确定我目前的解决方案是否正确:

int myInt;

ifstream dataFile(dataFileLocation, ios::in | ios::binary);
dataFile.seekg(99, ios::beg);  //Pull data starting at byte 100;

//For 4-byte value:
char chunk[4];
dataFile.read(chunk, 4);
myInt = (int)(chunk[0] << 24 | chunk[1] << 16 | chunk[2] << 8 | chunk[3]);

//For 2-byte value:
char chunk[2];
dataFile.read(chunk, 4);
myInt = (int)(chunk[0] << 8 | chunk[1]);

这似乎适用于2字节数据但是我认为4字节数据上的值不正确。我已经读过有关htonl()的内容,但从我所读到的内容来看,这并不是一种灵活的方法。

1 个答案:

答案 0 :(得分:4)

仅使用无符号整数类型,你会没事的:

unsigned char buf[4];
infile.read(reinterpret_cast<char*>(buf), 4);

unsigned int b4 = (buf[0] << 24) + ... + (buf[3]);
unsigned int b2 = (buf[0] << 8) + (buf[1]);

转移涉及类型促销和无限期符号扩展(考虑到char的实现定义性质)。基本上你总是希望在操作位时一切都是无符号的。