您的位置:首页 > 编程语言 > C语言/C++

[C++]提取BMP文件时,位运算实现BYTE数组转换DWORD

2020-02-01 17:57 2819 查看

一、背景介绍:

在从一个数据包中提取BMP图像数据时,发现其不像JPG文件有开始标志位0xFFD8和结束标志位0xFFD9的机制。但BMP文件以一个名为BITMAPFILEHEADER的结构体开始,该结构体共占用14个字节。其结构如下图所示:
一个BMP文件总是以0x424D开始,也就是BITMAPFILEHEADER中的bfType变量的值。那么可以将bfType变量的地址作为BMP文件的起始地址,提取长度为bfSize的字节数组就可得到该BMP文件的全部数据。用UltraEdit打开一个BMP文件,部分文件结构如下图所示:

我们可以发现紧接着文件类型变量bfType(前两个字节,0x424D),bfSize的值为0x000AFCB6(小端存储方式,较高数据位存放在较低地址位),换算成10进制即为720054,说明该文件大小为720054字节。文件属性如下图所示:

二、实现BYTE数组转换DWORD

问题描述:提取BMP文件的方法是采用memcpy()从原始数据包中拷贝数据到一个新的BYTE数组,需要获取拷贝数据的长度,而我们获得的长度信息是一个长度为4的BYTE数组且以小端方式存储,不能直接使用,新的问题是如何将提取出来的长度信息变为可用。

解决方法:我们知道DWORD是unsigned long类型的别名,占4个字节,本质上还是整数类型,那么可以声明一个该类型变量,赋初值为0,将提取到的BYTE数组中每一项(一个字节)从低位到高位移位之后与其进行或运算即可得到可用的长度信息。具体代码如下:

//以之前打开的bmp文件为例
BYTE bmp_size[] = {0xB6, 0xFC, 0x0A, 0x00};//提取出来的数据排列方式
DWORD actual_pic_size = 0;//DWORD是unsigned long类型别名
for(int i = 0; i < 4; ++i)
{
actual_pic_size = actual_pic_size | (bmp_size[i] << (i * 8));//左移8位
}

参考BMP文件格式详解

  • 点赞
  • 收藏
  • 分享
  • 文章举报
reflectionEt1rnal 发布了3 篇原创文章 · 获赞 0 · 访问量 81 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐