当前位置:  开发笔记 > 编程语言 > 正文

多字节字符常量和位图文件头类型常量

如何解决《多字节字符常量和位图文件头类型常量》经验,为你挑选了1个好方法。

我有一些现有的代码,我曾经用它写出一个图像到位图文件.其中一行代码如下所示:

bfh.bfType='MB';

我想我可能是从某个地方复制过的.其他开发者之一对我说"看起来不对,是不是应该是'BM'?" 无论如何它似乎确实工作正常,但在代码审查它被重构为:

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

谷歌搜索表明大部分时间,第一行似乎被使用,而有些人会这样做:

bfh.bfType=0x4D42;

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



1> Dave..:

这三个都是(可能)等同的,但出于不同的原因.

bfh.bfType=0x4D42;

这是最容易理解的,它只是加载bfType,其数字恰好代表位8-15中的ASCII"M"和位0-7中的ASCII"B".如果以little-endian格式将其写入流中,则流将包含"B","M".

bfh.bfType='MB';

这基本上等同于第一个语句 - 它只是表达整数常量的另一种方式.它可能完全取决于编译器对它的作用,但它可能会根据您编译的机器的字节序生成一个值.如果你在同一个endian-ness的机器上编译和执行,那么当你在流上写出值时,你应该得到'B','M'.

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

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

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有