`
yuanlanxiaup
  • 浏览: 857779 次
文章分类
社区版块
存档分类
最新评论

DBF文件数据结构实例分析

 
阅读更多
DBF文件数据结构实例分析

下面以一个具体实例来分析DBF数据结构:

该表格数据为:

1

2

1

2

2

4

3

6

4

8

5

10

6

12

7

14

8

16

9

18

10

20

UltraEdit打开该dbf文件,其内容如下:

现在先分解一下,找出文件头,并分析一下文件头的内容。首先看第一个字节,值为03,这个是16进制的数据,第一个字节表示数据库类型,值030x03,对应FoxBASE+/Dbase III plus,。然后看第4个字节到第7个字节,这一段表示文件中的记录条数,即表格的行数,其Byte值为0A 00 00 00,转换成Int32即为10,即表格的行数为10。关于Byte数组转换成数值类型,其代码如下:

/// <summary>

/// 将字节组转换成为整型

/// </summary>

/// <param name="tempBytes">字节数组</param>

/// <returns></returns>

public static Int32 ConvertBytesToInt32(byte[] tempBytes)

{

Int32 result = System.BitConverter.ToInt32(tempBytes, 0);

return result;

}

接着看第8个和第9字节,其值为61 00,转换成Int16其值即为97,意思就是说文件头所占字节长度为97,所以文件头的范围就是下面红色框内:

蓝色框为左边红色框对应的值,这个仅供参考。下面来仔细分析红色框中的数据:

前面的第1个字节到第8个和第9个字节我们前面都已经分析过了。第1011个字节对应值表示一行数据的长度,其值为13 00,转换为Int其值为19,即每行数据占19个字节的长度,这个值应该等于接下来定义字段长度之和+1(每行最前面还有一个16进制值为20的字节)。

接下来的从第12个到31个都为保留字节,可以不管。因为前面已知文件头的长,97,而用于文件头定义就占了32个,文件头最后一个字节用于表示字段定义结束,也占了一个,于是就只剩下97-32-1=64,而每定义一个字段占32个字节,所以就只有2个字段。第一个字段就是从第33个字节开始到第33+32个字节,如下面黄色框中:

下面参考第三个表来分析这段数据,已知从第0开始到1011个字节表示的字段的名称,将这11个字节数组转换成字符串即为字段名称。将字节数组转换成字符串代码如下:

/// <summary>

/// 将字节组转换成为字符串

/// </summary>

/// <param name="tempBytes">字节数组</param>

/// <returns></returns>

public static string ConvertBytesToString(byte[] tempBytes)

{

string result = System.Text.Encoding.GetEncoding("gb2312").GetString(tempBytes);

return result;

}

将第0到第10个字节值转换成字符串,其值为“列1”,即第一个字段的名称。

11个字节为字段数据类型,该值为4E(上图中用绿色标出),转换为char即为NN表示数值类型,即第一列的数据类型为数值类型。

12个到第15个为保留字节,暂不管。第16个字节表示字段的长度,其值为09(上图中用绿色标出),转换为Int其值即为9,即表示该字段长度为9个字节。后面从第1731个字节都可暂不管。这样就分析完了一个字段的定义,安装同样的思路分析第二个字段,可以得到第二字段名称为“列2”,字段类型也为数值类型(N),字段长度也为9个字节。如下图所示,注意绿色框中的数据:

在第二个字段定义完成后,接下来的一个字节值为0D,即表示结束了字段定义,刚好在此也是97个字节。从第98个字节开始就是表格的数据对象了,每行占19个字节,其中第一个字节值为20,不属于表格单元的值,即从第99个字节开始,前面9个字节对应的值为第一行第一列单元的值,接着的9个字节是第一行第二列单元的值,在接下来的一个字节为默认字节,接着的9个字节就是第2行第一列单元的值,接下来的9个字节就是第2行第2列单元的值,依次类推,直到结束位置。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics