IP数据包校验和 source code
recvfrom 10014:系统检测到在一个调用中尝试使用指针参数时的无效指针地址。

在操作BMP中碰到的问题:BMP头部信息与字节对齐

ckfan posted @ 2012年11月05日 14:40 in 技术blog , 2663 阅读
今天在进行对一张单色bmp读取数据时,碰到了挺多的问题。
这里总结下。
1.对BMP的头部信息了解有误。BMP包含图像文件头,图像由于BMP中信息头,调色板数据,图像数据。
这里调色板数据的大小为N*4byte.这里需要注意的是调试板并不是所有的图片都有调试板的,需要取
决于biCompression,当biCompression成员的值是BI_RGB时,它没有调色板。而且biBitCount大
等于24的时候,没有调试版,biBitCount为32的时候,biCompression为BI_RGB时,没有调试板,
为BI_BITFIELDS原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、
绿、蓝分量在32位中所占的位置。具体的BMP的调试板相关问题就到这里,详细信息MSDN(BITMAPINFOHEADER),
如果想中文版的,可以百科http://baike.baidu.com/view/189487.htm

2.字节对齐问题
// 位图文件头
typedef struct tagBITMAPFILEHEADER
{
	int16u	bfType;			// 位图文件的类型,必须为BM
	int32u	bfSize;			// 位图文件的大小,以字节为单位
	int16u	bfReserved1;	// 位图文件保留字,必须为0
	int16u	bfReserved2;	// 位图文件保留字,必须为0
	int32u	bfOffBits;		// 位图数据的起始位置,以相对于位图
				// 文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;

/*test.bmp 头部HEX
00000000h: 42 4D FE 3F 00 00 00 00 00 00 3E 00 00 00 28 00 ; BM?......>...(.
00000010h: 00 00 80 01 00 00 54 01 00 00 01 00 01 00 00 00 ; ..€...T.........
00000020h: 00 00 C0 3F 00 00 00 00 00 00 00 00 00 00 00 00 ; ..?............
00000030h: 00 00 00 00 00 00 FF 00 00 00 00 00 FF 00       ; ............
*/
code:
fs.open("./test.bmp", ios::in);
			
if(fs.is_open() == false)
			
{
	
     printf("\r\n TestMid: open print_header.tmp failed... \r\n");

     continue;
		
}
			
// 读取位图文件头
memset(&file_header, 0, sizeof(BITMAPFILEHEADER));
fs.read((char*)&file_header, 14);
fs.seekg(file_header.bfOffBits);
fs.read(...);
....
可是每次数据读出来什么都没有,加了各种调试信息。后面发现file_header.bfOffBits 为0,
这时候我就奇怪了......后面才想起字节对齐问题,平时也了解了字节对齐相关问题,
但是在实际编程中还是忽略了。

解决上面的问题:
方法一:
fs.read((char*)&file_header.bfType, 2);
			
fs.read((char*)&file_header.bfSize, 4);
			
fs.read((char*)&file_header.bfReserved1, 2);
			
fs.read((char*)&file_header.bfReserved2, 2);
			
fs.read((char*)&file_header.bfOffBits, 4);

方法二:
#pragma pack(1)
 /*指定按1字节对齐*/
// 位图文件头
typedef struct tagBITMAPFILEHEADER
{
	int16u	bfType;			// 位图文件的类型,必须为BM
	int32u	bfSize;			// 位图文件的大小,以字节为单位
	int16u	bfReserved1;	// 位图文件保留字,必须为0
	int16u	bfReserved2;	// 位图文件保留字,必须为0
	int32u	bfOffBits;		// 位图数据的起始位置,以相对于位图
	// 文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;
#pragma pack()// 恢复


这里就不再重复字节问题了,具体可以见这个BLOG:http://www.cnblogs.com/logogcn/archive/2010/11/30/1891699.html,写的很好。
seo service UK 说:
2024年1月16日 15:23

Excellent points?I would notice that as someone who in reality doesn’t write on blogs a lot (actually, this can be my first publish), I don’t assume th


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter