我试图读取BMP文件的头并从中提取宽度。
我知道文件格式使用的是小endian格式,所以我读取它的字节数,并编写此函数以从4个字符/字节中汇编一个整数:

int assembleInt(char pos1, char pos2, char pos3, char pos4)
{
  new_int = 0;
  new_int += (pos4 << 24);
  new_int += (pos3 << 16);
  new_int += (pos2 << 8);
  new_int += pos1;
  return new_int;
}

对我来说,这看起来应该管用。
如果我读取的位图宽度是1200*1200,则得到944我已经在十六进制编辑器中打开文件进行检查,文件没有问题。
我想可能是因为我想把一个字符移到界外,所以我把它改成了:
int shifter = 0;
new_int += (shifter + pos4) << 24;

但没有解决任何问题。
我希望你能帮助我,非常感谢!

最佳答案

实际上问题不在轮班,因为这行的数字是1200:

new_int += pos1;

其中pos1隐式转换为int,并且由于它是值为0xB0(1200=0x4B0)的带符号char,因此它被解释为负显示为“下一个字节少1”。
其他行也有同样的问题,但是当使用值1200时,它没有被表示出来这使得这个问题变得特别狡猾,因为你可能看到的每一个中间值都是正确的,而错误的值是在看起来不可能是错误的行中创建的在某种程度上,这条线并不是真的错了,类型是错的。

关于c - C:按位排列的小端序困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28381629/

10-11 00:25