2009-03-02 23 views
1

我有一些现有的代码用于将图像写入位图文件。其中一行代码如下所示:多字节字符常量和位图文件标题类型常量

bfh.bfType='MB'; 

我想我可能是从某处复制的。其他开发者之一对我说:“这看起来不正确,是不是应该是'BM'?”反正它似乎好的工作,但在代码审查它被重构到这一点:

bfh.bfType=*(WORD*)"BM"; 

谷歌搜索显示,大部分的时间,第一线似乎被使用,而有些时候人们会这样做:

bfh.bfType=0x4D42; 

那么有什么区别?他们如何能够给出正确的结果?无论如何,多字节字符常量意味着什么?他们真的一样吗?

回答

4

所有三个(可能)是等价的,但出于不同的原因。

bfh.bfType=0x4D42; 

这是最简单的理解,它只是用来加载bfType与多家恰好代表8-15位ASCII“M”和ASCII 0-7位“B”。如果你以little-endian格式将其写入流中,那么流将包含'B','M'。

bfh.bfType='MB'; 

这基本上等同于第一条语句 - 它只是一种表达整型常量的不同方式。它可能取决于编译器究竟是怎么处理它的,但它可能会根据你编译的机器的字节顺序产生一个值。如果你在一台具有相同字节序的机器上编译和执行,那么当你在流上写出值时,你应该得到'B','M'。

bfh.bfType=*(WORD*)"BM"; 

在这里,“BM”使编译器创建一个数据块,看起来像“B”,“M”,“\ 0”,并得到一个char *指向它。然后这被转换成WORD *,这样当它被解除引用时,它将把该内存读作WORD。因此它读取'B','M'到机器所具有的任何字节顺序中的bfType。使用相同的字节顺序写出来显然会在您的流上放置'B','M'。只要你使用bfType写出流,这是最便携的版本。但是,如果您正在使用bfType进行任何比较/比较,那么最好为其选择一个字节序列并在读取或写入该值时根据需要进行转换。

1

我没有找到API,但根据http://cboard.cprogramming.com/showthread.php?t=24453,bfType是一个bitmapheader。 BM的值很可能意味着“位图”。

0x4D42是一个十六进制值(M为0x4D,B为0x42)。在little endian写作方式(最低有效字节第一),这将是相同的“BM”(而不是“MB”)。如果它也适用于“MB”,那么可能会采用一些默认值。

0

补遗tehvan的帖子:

维基百科条目上BMP

File header 注意,BMP格式的文件(因此BMP头)的前两个字节存储在大 - 印第安单。这是神奇的数字'BM'。所有其他整数值都以little-endian格式存储(即最低有效字节在前)。

所以它看起来像重构代码是正确的,根据规范。

你有没有试过用'MB'作为魔术数字与几个不同的照片编辑器打开文件?