我正在用十六进制编辑器读取BMP文件,同时发现了一些奇怪的东西。两个第一个字母“BM”按顺序写入,但是下一个字(2B),即表示文件大小,是十六进制的36 30
。实际尺寸为0x3036
。我注意到其他数字以相同的方式存储。
我也使用MARS MIPS仿真器,它可以通过文字显示内存。字符串in.bmp
存储为b . n i
/ \0 p m
。
为什么数据不会连续存储?
答案 0 :(得分:2)
它不取决于数据本身,而取决于存储这些数据的方式:每个字节,每个字(通常为2个字节)或每个长度(通常为4个字节)。只要您按字节存储数据,就不会发现任何异常;数据出现"连续"。但是,如果单位较长,则需要endianness。
看来您的模拟器假设所有单词都需要反转字节;你可以在你的例子中看到这个假设并不总是有效。
至于BM
"魔法"签名:它不应被视为 word 值" BM",而是"首先,单个字节B
,然后单个字节M
"。所有下一个值都写在little-endian order中,而不仅仅是交换'您的36
和30
以及之前的2个零' (或'在'之后)(BMP header中较大的值为4字节long
类型)。