DBF文件格式说明

36 篇文章 11 订阅
16 篇文章 6 订阅

dBase是第一个在个人电脑上被广泛使用的单机版数据库系统,在CP/MDOS的时期,由Ashton-Tate公司所发表。在1980年,它最初是出现在CP/M的软件,而后被移植到AppleIIIBM PCDOS上。在dBase IIIdBase III Plus时,成为当时数据库市场的主流,而后其他公司推出功能相近甚至是强化的产品,例如ClipperFoxPro,它们被称为xBase

1.DBF文件的整体结构

文件头:包含①基本信息(含32字节的数据) ②字段格式说明(每项32个字节)

0D值的间隔符

记录1

记录2

记录3

记录n

1A结束符号

 

2.DBF文件头的详细格式:

①基本信息

在文件中的位置

内容

说明

0

1个字节

表示当前的版本信息

1-3

3个字节

表示最近的更新日期,按照YYMMDD格式。

4-7

1个32位数

文件中的记录条数。

8-9

1个16位数

文件头中的字节数。

10-11

1个16位数

一条记录中的字节长度。值应该是一条记录中所有字段的长度之和再加上1个字节,这额外一个字节是控制位,表示该记录是否被删除。

12-13

2个字节

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

14

1个字节

表示未完成的操作。

15

1个字节

dBASE IV编密码标记。

16-27

12个字节

保留字节,用于多用户处理时使用。

28

1个字节

DBF文件的MDX标识。在创建一个DBF 表时 ,如果使用了MDX 格式的索引文件,那么 DBF 表的表头中的这个字节就自动被设置了一个标志,当你下次试图重新打开这个DBF表的时候,数据引擎会自动识别这个标志,如果此标志为真,则数据引擎将试图打开相应的MDX 文件。

29

1个字节

Language driver ID.

30-31

2个字节

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

 

DBF文件头中记录项(字段)的详细格式:

位置

内容

说明

0-10

11个字节

记录项名称,是ASCII码值。

11

1个字节

记录项的数据类型,是ASCII码值。(B、C、D、G、L、M和N,具体的解释见表2.9)。

12-15

4个字节

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

16

1个字节

记录项长度,二进制型。

17

1个字节

记录项的精度,二进制型。

18-19

2个字节

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

20

1个字节

工作区ID。

21-30

10个字节

保留字节,用于以后添加新的说明性信息时使用,这里用0来填写。

31

1个字节

MDX标识。如果存在一个MDX 格式的索引文件,那么这个记录项为真,否则为空。

如一表有n个字段,该格式就有n项,共占空间32*n个字节。

  DBF文件中的数据类型:

代码

数据类型

允许输入的数据

B

二进制型

各种字符。

C

字符型

各种字符。

D

日期型

用于区分年、月、日的数字和一个字符,内部存储按照YYYYMMDD格式。

G

(General

or OLE)

各种字符。

N

数值型(Numeric)

- . 0 1 2 3 4 5 6 7 8 9

L

逻辑型(Logical)

? Y y N n T t F f (? 表示没有初始化)。

M

(Memo)

各种字符。

 

④记录数据

序号

控制位

内容

1

20

字段1内容字段2内容字段n内容

2

20

 

3

20

 

20

 

n

20

 

每个记录第一个自己是控制位,表示该记录是否被删除,0x20表示没有被删除,0x2A表示删除。

举例说明:

假如文件中有10条记录,每个记录有4个字段,4个字段的长度分别为:12、14、16、18,那么文件的详细格式如下:

文件头占32+32*4+1个字节:

32个字节是文件头中的基本信息,32*4个字节是记录项(即字段的定义信息),最后一个字节分别是16进制的0D0D是文件头终止标识

数据信息占(1+12+14+16+18)*10+1个字节:

1+12+14+16+18个字节,其中1是控制位占的,其他是每个数据项占的,共10条记录最后一个字节是数据的终止表示通常是16进制表示的1A。

补充说明:

由于上述文件格式的定义,决定了字段名称不能超过11个字节(或者5个中文字符),字符类型的字段,数据最大不能超过255个字节在从文本、Excel、大型数据库导出数据到DBF格式文件时,一定要考虑到这些长度限制。 

 

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用 Java 解析 DNF NPK 文件的基本代码示例: ```java import java.io.*; public class NpkParser { private static final int HEADER_SIZE = 20; public static void main(String[] args) { String npkFilePath = "/path/to/your/npk/file.npk"; try (RandomAccessFile raf = new RandomAccessFile(npkFilePath, "r")) { // 读取 NPK 文件头部信息 byte[] headerBytes = new byte[HEADER_SIZE]; raf.read(headerBytes); String magic = new String(headerBytes, 0, 4); int version = readInt(headerBytes, 4); int fileCount = readInt(headerBytes, 8); int headerSize = readInt(headerBytes, 12); int dataSize = readInt(headerBytes, 16); System.out.println("Magic: " + magic); System.out.println("Version: " + version); System.out.println("File count: " + fileCount); System.out.println("Header size: " + headerSize); System.out.println("Data size: " + dataSize); // 读取 NPK 文件中的每个文件信息 for (int i = 0; i < fileCount; i++) { byte[] fileBytes = new byte[headerSize]; raf.read(fileBytes); String fileName = new String(fileBytes, 0, 64).trim(); int fileOffset = readInt(fileBytes, 64); int fileSize = readInt(fileBytes, 68); System.out.println("File name: " + fileName); System.out.println("File offset: " + fileOffset); System.out.println("File size: " + fileSize); // 读取当前文件的数据 byte[] fileData = new byte[fileSize]; raf.seek(fileOffset); raf.read(fileData); // TODO: 处理当前文件的数据 } } catch (IOException e) { e.printStackTrace(); } } private static int readInt(byte[] bytes, int offset) { return (bytes[offset] & 0xff) | ((bytes[offset + 1] & 0xff) << 8) | ((bytes[offset + 2] & 0xff) << 16) | ((bytes[offset + 3] & 0xff) << 24); } } ``` 这段代码展示了如何读取 NPK 文件的头部信息和每个文件的信息,以及如何读取每个文件的数据。在 `TODO` 的位置,你可以添加自己的代码来处理每个文件的数据。需要注意的是,代码中只处理了 NPK 文件中的基本信息,如果你需要处理更多的信息,可以参考 DNF NPK 文件格式的具体说明
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值