[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文件格式详解
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- java 实现 图片文件 与 byte 数组互相转换
- .net 实现对文件对流对byte数组的压缩
- java将图片缩放实现类(能将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换)
- 文件内容提取到byte数组里
- C++实现文件简单加密与解密(读取文件中的字符,对字符转换,然后写入,完成加密,解密反之)
- c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换
- android 将图片内容解析成字节数组,将字节数组转换为ImageView可调用的Bitmap对象,图片缩放,把字节数组保存为一个文件,把Bitmap转Byte
- c#调用c++写成的dll文件,返回char*,返回数组,用ref接收,byte[] (zz)
- Java 文件和byte数组转换
- C/C++实现bmp文件读写
- java实现linux中gzip压缩解压缩算法:byte[]字节数组,文件,字符串,数据流的压缩解压缩
- BMP文件学习笔记(一): C/C++语言实现.bmp文件读写
- Android学习 之 Bitmap Drawable byte[] 三者之间的转换以及把数组存入数据库及提取数据重新组合成所需对象,如图像
- java 文件和byte数组相互转换
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
- byte数组转float实现与byte转换其它类型时进行&运算原理
- C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换
- C++读取、旋转和保存bmp图像文件编程实现
- 标准的c++中int,float,double等怎么转换成string类,并实现文件写入
- java实现zlib压缩解压缩:文件、byte[]字节数组,数据流