在C++中从二进制文件读取字节时,整数有时会偏离正256或负256



我有一个二进制数据集,我试图通过一次读取2个字节来提取16位整数。我正在尝试复制我在JavaScript中已经拥有的实现,这意味着我有正确的输出来进行测试。出于某种奇怪的原因,在读取的120个整数中,有8个在任意一个方向上正好偏离256。一开始我以为我误读了一位,但在看了二进制数字后,有些数字偏离了不止一位。例如,读入的一个整数是1297(1100010001(,而它本应是1553(10100010001(,其中第二个和第三个最高有效位不同。有人看到我哪里错了吗?如果有帮助的话,我可以发布正确的JavaScript代码。

ifstream inputFile (inp, ios::binary);
int test = 0;
int fileHeaderOffset = 80+648+2700;
int x = 840;
int y = 359;
int columnBytes = 2414;
int width = 120;
int height = 121;
int16_t buff[height * 2];
int offset = fileHeaderOffset + (x * columnBytes) + (y * 2) + 8;
inputFile.seekg(offset+1);
for(int j = 0; j < height * 2; j++){
   inputFile.read((char*)&buff[test], 2);
   test++;
}

我发现了问题所在。我读了一个字节太远,而且无法进行字节交换。seek的额外字节使其获取正确整数的低字节和后面整数的高字节。由于整数在点之间变化不大,相邻点的高字节通常相同,因此它通常有效,但当整数超过256的倍数时,高字节会发生变化,该字节的偏移量为1,这意味着数字的偏移量是256。

最新更新