当前位置: 技术问答>linux和unix
写位图文件(BMP)在x86和sparc上不同的效果
来源: 互联网 发布时间:2016-03-27
本文导语: 位图头文件结构 typedef struct myBarCodeBITMAPFILEHEADER { WORD bfType='MB'; // 位图文件的类型,必须为 DWORD bfSize=326; // 位图文件的大小,以字节为单位 WORD bfReserved1=0; WORD bfReserved2=0; DWORD bfOffB...
位图头文件结构
typedef struct myBarCodeBITMAPFILEHEADER
{
WORD bfType='MB'; // 位图文件的类型,必须为
DWORD bfSize=326; // 位图文件的大小,以字节为单位
WORD bfReserved1=0;
WORD bfReserved2=0;
DWORD bfOffBits=62; // 位图数据的起始位置T字节为单位
} BARCODEBITMAPFILEHEADER;
写完毕位图文件(BMP)在x86和sparc上不同,sparc生成的BMP无法浏览.他们的二进制文件在头三行不一样,不同部分如下
x86:
4D 42 00 00 01 46 00 00 00 00 00 00 00 3E 00 00
00 28 00 00 00 21 00 00 00 21 00 01 00 01 00 00
00 00 00 00 01 08 00 00 00 00 00 00 00 00 00 00
00 02 00 00 00 02 FF FF FF 00 00 00 00 00 EA 9E
sparc:
42 4D 46 01 00 00 00 00 00 00 3E 00 00 00 28 00
00 00 21 00 00 00 21 00 00 00 01 00 01 00 00 00
00 00 08 01 00 00 00 00 00 00 00 00 00 00 02 00
00 00 02 00 00 00 FF FF FF 00 00 00 00 00 EA 9E
我认为是字节序的问题,在solaris sparc上把位图头文件的值进行了字节序转换,然后在生成bmp图片,造成的后果是其二进制文件几乎所有行都与x86下生成的bmp不一样了,而不仅仅是头三行了。
哪位高手说说看
附:字节序转化函数如下
void BigToLittleEndian(char *buf, short size) //big endian和little endian的转换
{
char tmp;
switch (size) {
case 2:
tmp=buf[0]; buf[0]=buf[1]; buf[1]=tmp;
break;
case 4:
tmp=buf[0]; buf[0]=buf[3]; buf[3]=tmp;
tmp=buf[1]; buf[1]=buf[2]; buf[2]=tmp;
break;
case 8:
tmp=buf[0]; buf[0]=buf[7]; buf[7]=tmp;
tmp=buf[1]; buf[1]=buf[6]; buf[6]=tmp;
tmp=buf[2]; buf[2]=buf[5]; buf[5]=tmp;
tmp=buf[3]; buf[3]=buf[4]; buf[4]=tmp;
break;
default:
break;
}
return;
}
typedef struct myBarCodeBITMAPFILEHEADER
{
WORD bfType='MB'; // 位图文件的类型,必须为
DWORD bfSize=326; // 位图文件的大小,以字节为单位
WORD bfReserved1=0;
WORD bfReserved2=0;
DWORD bfOffBits=62; // 位图数据的起始位置T字节为单位
} BARCODEBITMAPFILEHEADER;
写完毕位图文件(BMP)在x86和sparc上不同,sparc生成的BMP无法浏览.他们的二进制文件在头三行不一样,不同部分如下
x86:
4D 42 00 00 01 46 00 00 00 00 00 00 00 3E 00 00
00 28 00 00 00 21 00 00 00 21 00 01 00 01 00 00
00 00 00 00 01 08 00 00 00 00 00 00 00 00 00 00
00 02 00 00 00 02 FF FF FF 00 00 00 00 00 EA 9E
sparc:
42 4D 46 01 00 00 00 00 00 00 3E 00 00 00 28 00
00 00 21 00 00 00 21 00 00 00 01 00 01 00 00 00
00 00 08 01 00 00 00 00 00 00 00 00 00 00 02 00
00 00 02 00 00 00 FF FF FF 00 00 00 00 00 EA 9E
我认为是字节序的问题,在solaris sparc上把位图头文件的值进行了字节序转换,然后在生成bmp图片,造成的后果是其二进制文件几乎所有行都与x86下生成的bmp不一样了,而不仅仅是头三行了。
哪位高手说说看
附:字节序转化函数如下
void BigToLittleEndian(char *buf, short size) //big endian和little endian的转换
{
char tmp;
switch (size) {
case 2:
tmp=buf[0]; buf[0]=buf[1]; buf[1]=tmp;
break;
case 4:
tmp=buf[0]; buf[0]=buf[3]; buf[3]=tmp;
tmp=buf[1]; buf[1]=buf[2]; buf[2]=tmp;
break;
case 8:
tmp=buf[0]; buf[0]=buf[7]; buf[7]=tmp;
tmp=buf[1]; buf[1]=buf[6]; buf[6]=tmp;
tmp=buf[2]; buf[2]=buf[5]; buf[5]=tmp;
tmp=buf[3]; buf[3]=buf[4]; buf[4]=tmp;
break;
default:
break;
}
return;
}
|
。。。。
解释下,生成bmp图片,就是说得到需要写到文件中的数据。
然后再写文件,是说把应该写到文件中的数据写到文件中。
生成数据和写文件,不是一码事。