敬业的IT人 >> 编程开发 >> 其他语言 >> PDB文件结构分析

PDB文件结构分析

敬业的IT人 互联网 佚名 2008-1-4 14:07:48

PDB文件结构分析(图一)

  在我们目前使用的掌上电脑中,Palm操作系统由于其功能强大、应用软件多等特点,占有很大的比例。PDB文件是Palm OS操作系统上数据文件类型。一般我们在使用Palm系统的电子书时都会遇到这种文件,本文着重分析该文件的结构,及其在PC机上生成的方法。

  

    ·收藏:全部文件格式大全
    ·电脑里所有浪费内存的垃圾文件
    ·看看你电脑里面有多少垃圾文件浪费内
    ·让QQ能播放RM格式影音文件
    ·各种文件后缀名与打开方式大全
    ·文件恢复利器,Handy Rcovery
    ·Excel快速导入文本文件技巧
    ·文件后缀名大全
    ·另类技巧 教你“打开文件”提速
    ·如何安装微软IIS5.1安装文件


  PDB文件的逻辑结构如下图所示:

PDB文件结构分析(图三)

  PDB文件的结构是由下面几个部分组成的:

   数据库头部(Database Header)

   记录入口列表(List of Record Entries)

   应用信息块(AppInfo Block)(可选)

   排序信息块(SortInfo Block)(可选)

   数据库记录信息(Sequence of raw record data)

  其中在数据库头部结构中,确定了应用信息块(AppInfo Block)和排序信息块(SortInfo Block)的位置信息。记录入口列表中确定了所有记录的位置相关的信息。

  其中数据库头部的长度是固定的。应用信息块和排序信息块可有可无,而且尺寸也不确定,在很多结构简单的PDB文件中,没有该部分信息,本文中将不再详细阐述。记录入口列表的长度也随着纪录数量的变化发生变化。

typedef struct {
 UInt8 name[dmDBNameLength];
 UInt16 attributes;
 UInt16 versiborder="0" align="center" alt="PDB文件结构分析(图五)" width="420" height="196" />

typedef struct {
 LocalID nextRecordListID;
 UInt16 numRecords;
 UInt16 firstEntry;
} RecordListType;

  注意:placeholder byes-这两个字节专门用于字节对齐,如果没有任何记录,那么就在该位置放置0;否则在所有记录列表的最后放置0。

  字段描述

NextRecordListID下一个记录列表的偏移位置,如果没有下一个记录列表该项为0。NumRecords记录数量。FirstEntry首条记录的索引。

  

  AppInfo块:

  AppInfo块的数据结构如下:

typedef struct {
UInt16 renamedCategories;
Char categoryLabels[16][16];
UInt8 categoryUniqIDs[16];
UInt8 lastUniqID;
UInt8 padding;
} AppInfoType;

  字段含义:

RenamedCategories 指出哪个分类名称被使用了 CategoryLabel存放16个分类ID值的名称的数组,每个占用16个字节。CategoryID存放16个分类ID值的数组,每个占用一个字节。LastUniqID最后一个CategoryID对应数值。Padding没有使用

  SortInfo块:

  SortInfo块没有特定的结构规定,完全取决于应用程序。

  5. PDB记录的结构

  PDB文件中的记录内容相对比较简单,主要分为数值类型和字符串类型:

  数值类型:

  数值类型包括UInt32、UInt16、UInt8、LocalID等。

  对于数值类型,只需要直接向PDB文件中写入规定的字节就可以了。如Uint32是32位的无符号整型,可直接写入4个字节,在Winodws编程时相当与DWORD,同样的道理Uint16等同于WORD,可直接写入2个字节,别的数值类型处理也比较类似。其中有一个比较关键的问题,字节顺序问题,在下面的"特别注意事项"章节中描述。

  字符串类型:

  因为每个字符串的长度不一致,所以不能通过写入规定字节数的方法,而是通过在字符串结束后写入0作为结尾。这样读写PDB文件的字符串,就可实现长度可变。

  6. 特别注意事项

  字节顺序的问题:

  微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。正序存放就是高字节存放在前低字在后,而逆序存放就是低字节在前高字节在后。例如,十六进制 数为A02B,正序存放就是A02B,逆序存放就是2BA0。摩托罗拉(Motorola)公司的微处理器使用正序存放,而英特尔(Intel)公司的微处理器使用逆序。

  我们一般在PC机上编写程序时,计算机一般使用Intel或其他指令与之兼容的X86体系的CPU,所以都是按照逆序写文件的。而装载Palm的PDA一般使用摩托罗拉的CPU(如龙珠Dargon Ball),这些CPU使用正序存放。这中间就有一个字节顺序转换的问题。

  笔者在开始进行Palm编程时,花了一些时间才发现这一问题。

  我们可以通过一些宏定义作字节顺序转换:

#define UInt32 DWORD
#define UInt16 WORD
#define UInt8 BYTE
#define LocalID DWORD
//转换32位的数值类型UInt32、LocalID等
#define MAKE32(x) MAKEDWORD(MAKEWORD(HIBYTE(HIWORD(x)), LOBYTE(HIWORD(x)), \
MAKEWORD(HIBYTE(LOWORD(x)), LOBYTE(LOWORD(x)))
//转换16位的数值类型UInt16等
#define MAKE16(x) MAKEWORD(HIBYTE (x), LOBYTE(x))
//Uint8 只有一个字节,不需要转换

  软件调试中模拟器的使用:

  在计算机上调试程序,一般都离不开PDA的模拟器-Emulator。模拟器上导入PDB文件有两种方式:

  (1) 直接在模拟器上安装。

  (2) 通过同步管理器同步到计算机中。

  使用第一种方式,装载文件时Emulator对文件要求比较宽松,很多项都没有检查,所以文件有些字段由问题,也可顺利装载。第二种方式对文件的检查非常严格,文件格式或数值有问题,同步就会失败。所以在调试数据和程序时需要经常使用同步管理器同步数据,以便对文件作比较彻底的检查,同时更加接近实际使用情况。

  笔者在调试程序的时候就发生过这些问题,直接在模拟器上安装可以通过,但真正同步到PDA上就出现了这样或那样的问题。结果发现是同步和直接安装之间有差异。

进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com