dbf文件的二进制文件格式

来源:互联网 发布:movie开源数据集 编辑:程序博客网 时间:2024/06/08 07:11

.dbf文件的二进制文件格式

 

表文件由头记录及数据记录组成。头记录定义该表的结构并包含与表相关的其他信息。头记录由文件位置 0 开始。数据记录1紧接在头记录之后(连续的字节),包含字段中实际的文本。
记录的长度(以字节为单位)等于所有字段定义的长度之和。表文件中存储整数时低位字节在前。
1.表头记录的结构:
字节偏移 说明
0 文件类型
0x02 FoxBASE
0x03 FoxBASE+/dBASE III PLUS,无备注
0x30 Visual FoxPro
0x43 dBASE IV SQL 表文件,无备注
0x63 dBASE IV SQL 系统文件,无备注
0x83 FoxBASE+/dBASE III PLUS,有备注
0x8B dBASE IV 有备注
0xCB dBASE IV SQL 表文件,有备注
0xF5 FoxPro 2.x(或更早版本)有备注
0xFB FoxBASE

1 - 3 最近一次更新的时间(YYMMDD)

4 - 7 文件中的记录数目

8 - 9 第一个数据记录的位置

10 - 11 每个数据记录的长度(包括删除标记)

12 - 27 保留

28 表的标记

0x01 具有 .cdx 结构的文件
0x02 文件包含备注。
0x04 文件是数据库(.dbc)
请注意,这个字节可以包含任何上面值的和。例如,0x03 表明表具有结构化.cdx和一个备注字段。

29 代码页标记

30 - 31 保留,包含 0x00

32 - n 字段子记录
字段的数目决定了字段子记录的数目。

表中每个字段都对应一个字段子记录。
n+1 头记录终止符(0x0D),
n+2n+264 此范围内的 263 个字节包含后链信息(相关数据库 (.dbc) 的相对路径)。如果第一个字节为 0x00,则该文件不与数据库关联。因此数据库文件本身总是包含 0x00。

头记录中的第 8 到第 9 个字节指示数据文件中数据的起始位置。

数据记录从 除标记字节开始。

如果此字节为 ASCII 空格 (0x20),该记录没有删除标记, 如果第一字节为星号 (0x2A),该记录有删除标记。

在标记之后是字段记录中所命名各字段中的数据

2.字段子记录结构

字节偏移 说明
0 - 10 字段名(最多 10 个字符 -若少于 10 则用空字符 (0x00) 填充)
11 字段类型
C-字符型
Y-货币型
N-数值型
F-浮点型
D-日期型
T-日期时间型
B-双精度型
I-整型
L-逻辑型
M-备注型
G-通用型
C-字符型(二进制)
M-备注型(二进制)
P-图片型

12 - 15 记录中该字段的偏移量

16 字段长度(以字节为单位)

17 小数位数

18 字段标记

0x01系统列(用户不可见)
0x02可存储 null 值的列
0x04二进制列(只适于字符型和备注型)

19 - 32 保留 


3._NullFlags字段说明

在某些DBF文件中,会发现一个名为_NullFlags的字段。这个字段是做什么用的呢。通过解析,发现该字段信息如下:

字段名: _NullFlags
字段类型:0(阿拉伯数字0)
字段长度:2
字段标记:0x05(即0x01(系统列)和0x04(二进制列)之和)

DBF结构并不允许可变长度的字段,因此事实上在DBF表里的 Varchar 和 Varbinary 字段其实是被填补上空格的。因此,Microsoft 已经有了一种跟踪 Varchar 和 Varbinary 字段的长度的机制,以保证当需要的时候返回经过正确的 Trim 的值。

通过查阅相关资料得知,在所有版本 VisualFoxPro 的DBF表中,如果其中某个字段可以接受 Null 值,那么这个表都会被增加一个隐藏的字段,名叫 _NullFlags。该字段中包含一个位值(bit value),用于指示在一条指定记录中的某个特定字段是否包含着一个 Null。例如,如果在一条记录中的第一个可接收 null 的字段中包含一个 null,那么 _NullFlags 中的位0就被设置为1。如果第二个可接收 null 值的字段中包含一个非 null 值,那么 _NullFlags 中的位1就被设置0。由于一个字节中有8位,_NullFlag 中字段的长度为可接收 null 值字段的数量处以8(即字段子记录第18字节值为0x02的字段数/8+1再取整,即为_NullFlags字段长度)。

 在 VFP 9 中,_NullFlags 服务于两个责任:它的位还指示在 Varchar 和 Varbinary 字段中的值是否将字段填满了。如果一个位包含0,则在一个字段中值的长度等于该字段的长度(这个字段是满的)。如果这个位包含1,则值的长度小于字段的长 度,这种情况下字段根据需要会被用空格填补,而且最后一位包含着字段的长度。例如,一个包含着"AB"这样内容的10位长度的Varchar 字段中,实际上包含的是"AB"后面跟上7个空格、再加上一个 CHR(2)(2代表值的长度),同时在 _NullsFlags 中该字段的位为1。

如果一个字段既可以接收 null 值又是 Varchar 或者 Varbinary 类型的,那么会用两位来表示一个字段。低的那位代表"满"状态、而高的那位代表 null 状态。例如,一个可接收 null 的10位Varchar字段中包含着"AB",它在 _NullFlags 中就用 01 来代表(0意味着不为 null,1意味着不满),而同一个字段中如果是一个 null 值则用11来表示(null并且不满)。


4.Memo File Structure (.FPT)

备注文件包含一个头记录以及任意数目的块结构。头记录中包含指向下一个自由块的指针以及以字节为单位表示的块大小。块的大小是在创建文件时由   SET   BLOCKSIZE   命令确定的。头记录从文件位置   0   开始并占用   512   个字节。命令   SET   BLOCKSJZE   TO   0   设置块大小为   1。

头记录之后是包含块标头与备注文本的各个块。表文件包含有用于引用备注块的块编号。备注文件中某个块的位置可由该块的编号与块大小(在备注文件的头记录中建立)相乘得到。所有的备注块均由偶数的块边界地址开始。每一备注块可以占用一个以上的连续块。

备注头记录

字节偏移   说明  
00   -   03   下一个自由块的位置1*  
04   –   05   未使用  
06   –   07   块大小(每个块的字节数)1*  
08   –   511   未使用  
1*  存储整数时,高位字节在前。 
对"下一个自由块 "的理解,就是指向文件尾,因为备注文件可以包括任意数目的块结构.
你在增加记录时要注意,一定要以块为单位增加,默认大小为64字节,最后把指针重新指向尾

备注块标头与备注文本

字节偏移   说明  
00   –   03   块签名   1*   (指示块中数据的类型)
0   –   图片(图片字段类型)
1   –   文本(备注字段类型)  
04   –   07   备注长度   1*   (以字节为单位)  
08   –   n   备注文本(n   =   长度)  
1*  存储整数时,高位字节在前。 

 

SEEALSO:

http://msdn.microsoft.com/en-us/library/8599s21w%28v=VS.71%29.aspx

 


 
格式保存的文件标头:
支持 null 值
日期时间型、货币型及双精度型数据
字符字段和备注字段标记为二进制
在数据库 (.dbc) 文件中添加表
提示 可以使用下面的公式求出表文件中字段的数目:(x - 296/32) 公式中,x 表示第一个记录的位置(表头记录的第 8 到第 9 个字节),296 表示 263(后链信息)+ 1(头记录终止符)+ 32(第一个字段子记录),32 是字段子记录的长度。

因为dbf文件的记录在文件数据部分,都是用ASCII码形式存放的,所以只要读出文件头和字段类型描述区的内容,就可以直接读取dbf文件中的每条记录。

 

参考:

http://msdn.microsoft.com/en-us/library/st4a0s68%28v=VS.71%29.aspx