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

标签 c++ windows

我有一些现有代码用于将图像写入位图文件。其中一行代码如下所示:

bfh.bfType='MB';

我想我可能是从某处复制的。其他开发者之一对我说“这看起来不对,它不应该是‘BM’吗?”无论如何它似乎工作正常,但在代码审查中它被重构为:

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

谷歌搜索表明,大多数时候,第一行似乎被使用,而有些时候人们会这样做:

bfh.bfType=0x4D42;

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

最佳答案

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

bfh.bfType=0x4D42;

这是最容易理解的,它只是用一个数字加载 bfType,该数字恰好表示 8-15 位中的 ASCII“M”和 0-7 位中的 ASCII“B”。如果您将其写入小端格式的流,则该流将包含“B”、“M”。

bfh.bfType='MB';

这基本上等同于第一条语句——它只是表达整数常量的一种不同方式。它可能完全取决于编译器对它的处理方式,但它可能会根据您编译的机器的字节序生成一个值。如果您在具有相同字节序的机器上编译和执行,那么当您在流中写出值时,您应该得到 'B'、'M'。

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

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

关于c++ - 多字节字符常量和位图文件头类型常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601430/

相关文章:

c++ - Windows 8 之前的 GetProcessDpiAwareness()

windows - Windows 7 启动/引导的时间

c++ - Windows 无边界 OpenGL 窗口出现奇怪的制表问题

c++ - 如何正确获取窗口标题

c++ - ARM 平台上的嵌入式 Linux 交叉编译 Clion

c++ - 有没有解决使用STL对用户输入数组进行排序的错误的解决方案?

c++ - 如何从 C++ 中的 vector 中删除几乎重复项

c++ - C++通过迭代器确定变量类型

c++ - SDL调整窗口大小

c# - 如何以编程方式控制我的电脑的音量?