Ubuntu下将D-Fend Reloaded二进制DAT文件转ASCII文本方法
问题:将MS-DOS应用的二进制数据库文件转换为纯文本
我有一个基于D-Fend Reloaded开发的MS-DOS应用,其数据库存储在DATABASE01.DAT文件中。在Ubuntu终端用file命令检测结果:
DATABASE01.DAT: application/octet-stream; charset=binary
尝试执行以下命令提取数据:
cat DATABASE01.DAT | tr -d '\0' | head -1
得到的部分数据存在乱码(显示为�),且无法确定字段分隔符(看似是14个空格长度):
AAA 362887637 � � FEDERES ATTIVI 309 FAUSH �6Cat
执行hexdump -C DATABASE01.DAT得到的十六进制片段:
00000000 50 49 45 52 49 4e 49 20 49 4f 4c 45 20 20 20 20 |AAA | 00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | | 00000020 20 39 34 30 31 34 32 36 31 20 20 20 20 20 20 20 | 362887637 | 00000030 06 00 02 00 7b 07 14 00 08 00 ca 07 07 00 09 00 |....{...........| 00000040 ca 07 20 20 20 20 20 20 20 50 45 52 55 47 49 41 |.. FEDERES| 00000050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
需要将该文件转换为可读的纯文本文件。
分析
从十六进制输出可判断,这是固定长度的二进制记录文件:
- 部分字段是ASCII字符串(补空格到固定长度),比如前16字节的文本字段、数字字符串字段
- 中间夹杂二进制数值(如
06 00是小端16位整数,对应十进制6),这些非打印字符被tr -d '\0'处理后变成乱码�
解决方法
1. 快速提取可读文本
使用strings命令自动过滤二进制内容,只保留可打印字符串:
strings -n 3 DATABASE01.DAT
-n 3参数用于过滤掉零散的空格,只提取长度≥3的有效文本片段。
2. 替换乱码为空格
如果需要保留字段结构,用sed把所有非打印字符替换为空格:
cat DATABASE01.DAT | sed 's/[^[:print:]]/ /g' | head -1
处理后乱码会被替换成空格,方便识别字段分隔。
3. 完整解析固定长度记录(需要精准字段定义)
若要完整提取所有数据(包括二进制数值),需先确定每个记录的总长度和各字段的字节位置:
- 先通过更多
hexdump输出确认单条记录的字节长度(比如从一个字段起始到下一个同类型字段起始的间隔) - 用Python解析二进制字段,示例代码(需根据实际字段位置调整):
with open('DATABASE01.DAT', 'rb') as f: # 假设单条记录为64字节,可根据实际调整 while record := f.read(64): # 提取第一个字符串字段(前16字节,转ASCII并去除末尾空格) field1 = record[:16].decode('ascii').strip() # 提取二进制数值(第48-49字节,小端16位整数) num_field = int.from_bytes(record[48:50], byteorder='little') # 提取第二个字符串字段(第56-72字节) field2 = record[56:72].decode('ascii').strip() # 用制表符分隔输出为纯文本 print(f"{field1}\t{num_field}\t{field2}")
内容的提问来源于stack exchange,提问作者cccnrc
相关产品推荐
相关产品推荐

