C语言编程练习2:
习题描述:分析aw导航系统中用到的SD文件,打印出该文件中包含的位图数量及每个位图数据的长度(Size)和位图透过色的RGB值(如果有的话);如果没有透过色,请输出无”NO”。(SD文件格式参见下页,文件的存储是按照4Byte对齐的方式进行,即如果某个Bitmap的数据长度不是4的倍数,会在后面加若干FF,凑成4的倍数)
注意:文件中存储的信息都是无符号数据。
步骤:
试读文件BMP3_1.SD。可以用UltraEdit打开BMP3_1.SD按照SD文件格式阅读:
(1),会发现这个SD文件长度的是0x0000A1AC;
(2),文件中有5个分类,它们基本信息分别是(0x0000,0x000030,0x00196C),(0x0001,0x00199C,0x003AFC),(0x0002,0x005498,0x001A14)
(0x0003,0x006EAC,0x001778),(0x0004,0x008624,0x001B78),后面FFFFFFFF是分类信息结束符号;
(3),第1分类的起始地址,通过分类base地址(分类的起始地址0x00000010)加上1分类的Offset(0x000030)得出(0x000040),从这个地址开始就是第1分类内Bitmap信息(每个分类内有多个Bitmap的信息),数据长度一共0x00196C;
(4),第1分类内有4个Bitmap,它们的基本信息是(0x0000,0x000028,0x00079D),(0x0001,0x0007C8,0x000639)
(0x0002,0x000E04,0x000538),(0x0003,0x00133C,0x00062D),FFFFFFFF是Bitmap信息结束符号,其中0x00079D,0x000639,0x000538,0x00062D就是我们要找的Bitmap的长短;
(5),第一个Bitmap的数据通过每个分类内的Bitmap的基地址加每个Bitmap的偏移量(如第1分类内Bitmap的基地址是0x00000040,加上它偏移量0x000028,得出0x00000068就是第1个Bitmap的起始地址),可以得到每个Bitmap的数据,判断它是否有透过色,得出我们所求;依此类推可以得出第1分类内的所有bitmap的信息;
(6),对于第2分类,它的分类起始地是0x00000010 + 0x00199C= 0x0019AC向;
(7)第2分类内也有4个bitmap(基本信息),分别是(0x0000,0x000028,0x07A7),(0x0001,0x0007D0,0x001430),(0x0002,0x001C00,0x0017BA),(0x0003,0x0033BC,0x00073F),FFFFFFFF是Bitmap信息结束符号;
(8)第2个分类内第1个Bitmap的数据的起始地址是0x0019AC(类的基地址)+0x000028(Bitmap的偏移量)=0x0019D4,这就是Bitmap的数据。。。。。。。。依此类推得出所有分类内Bitmap信息。
2,编程序读出这个SD文件(BMP3_1.SD)内所有的Bitmap信息;
3,在成功读出BMP3_1.SD内信息后,用程序尝试读取文件BMP3_2.SD中的Bitmap信息(BMP3_1.SD和BMP3_2.SD两个文件的格式一样),会获取更多Bitmap的信息。
―――――――SD文件的数据格式―――――――
⑤-1.SDfile( BMP3.SD )
No.
項目
size(型)
説明
1
Header
16
[⑤-1-1]
2
分类内data offset record的排列.
-
[⑤-1-2]
3
分类内data的排列
-
[⑤-1-3]
[⑤-1-1]header
No.
項目
size(型)
説明
1
File size.
4(UI)
2
Reserve
12
全0
[⑤-1-2]分类内data offset record
No.
項目
Size(型)
説明
1
分类No.
2(UI)
如果分类No.为0xffff,则作为排列的最终record。
2
相对于分类内data的排列先頭的offset
3(UI)
分类内data offset record的排列的先頭基准,byte単位*1
3
分类内data的size
3(UI)
byte単位*1
[⑤-1-3]分类内data
No.
項目
Size(型)
説明
1
Bit map data offset record的排列
-
[⑤-1-3-1]
2
Bit map data的排列
-
[⑤-1-3-2]
[⑤-1-3-1]bit map data offset record
No.
項目
Size(型)
説明
1
Bit mapNo.
2(UI)
如果Bit mapNo0xffff,则作为排列的最终reocrd。
2
相对于Bit map data先頭的offset
3(UI)
Bit map data offset record的排列先頭基准,byte単位*1
3
Bit map data的size
3(UI)
byte単位*1
[⑤-1-3-2]bit map data
No.
項目
Size(型)
説明
1
Bit map data属性flag
1
[⑤-1-3-2-1]
2
透过色指定(R)
1(UI)
透过色指定flagON時有効
3
透过色指定(G)
1(UI)
透过色指定flagON時有効
4
透过色指定(B)
1(UI)
透过色指定flagON時有効
5
Bit map data
-
BMPfile形式、圧縮flag ON時,对BMPfile进行slide圧縮,并保存
6
4byte調整用boundary
0~3
[⑤-1-3-2-1]bit map data属性flag
No.
Bit
項目
説明
1
0
圧縮flag.
如果ON(=1),则表示bit map data被进行了压缩。
2
1
透过色指定
如果ON(=1),则表示bit map data中的指定色为透过色。
3
2~7
reserve
全0
* UI表示无符号、整数値,値按照big endian来保存。
*1 如果为最终record,offset、soze都为0xffffff。