如何将巨大的二进制数据转换为ASCII格式?

时间:2016-10-12 08:51:27

标签: python struct python-2.x binascii

我想读取包含巨大二进制数据的文件。我想将这个二进制数据转换为ASCII格式。在开始时,我想读取2个字节,表示消息的大小,消息超出大小。阅读完整条消息后,再次重复相同的操作,消息大小为2字节,然后是实际消息。

打印输入数据的代码 -

with open("abc.dat", "rb") as f:
byte = f.read(1)
i = 0 
while byte:
    i += 1
    print byte+' ',
    byte = f.read(1)
    if i is 80:
        sys.exit()

输入数据(80字节) -

  O  T  C  _  A  _  R  C  V  R                                                            P  V  �  W          �  w              /  �              �  �  '            �  �  &  �  

edit1-                                   。 > 输出使用hexdump -n200 otc_a_primary_1003_0600.dat命令 -

0000000 4f03 4354 415f 525f 5643 0052 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 5650 57f2 0000 0000
0000030 77d1 0002 0000 0000 902f 0004 0000 0000
0000040 a2bd 1027 0000 0000 d695 e826 2e0b 3e11
0000050 aa55 0300 f332 0000 0046 0000 0000 0000
0000060 5650 57f2 0000 0000 22f8 0a6c 0000 0000
0000070 3030 3030 3730 3435 5135 0000 0000 0100
0000080 bdb4 0100 3000 5131 5a45 1420 077a 9c11
0000090 3591 1416 077a 9c11 dc8d 00c0 0000 0000
00000a0 0000 4300 5241 2020 7f0c 0700 ed0d 0700
00000b0 2052 2020 2030 aa55 0300 f332 0000 0046
00000c0 0000 0000 0000 5650                    
00000c8

我使用的是python' struct模块。 python版本 - python 2.7.6

程序代码 -

import struct

msg_len = struct.unpack('h', f.read(2))[0]
msg_data = struct.unpack_from('s', f.read(msg_len))[0]
print msg_data

但是我无法看到实际的消息,只有单个字符在控制台上打印。我怎样才能以适当的方式阅读这样的二进制文件消息?

3 个答案:

答案 0 :(得分:2)

这取决于您的两个字节长度在数据中的存储方式,例如,如果文件的前两个字节(作为十六进制)是00 01这是否意味着后面的消息是1字节长或256字节长?这被称为大端或小端格式。尝试以下两种方法,一个应该给出更有意义的结果,它旨在读取消息长度块中的数据:

大端格式

import struct

with open('test.bin', 'rb') as f_input:
    length =  f_input.read(2)

    while len(length) == 2:
        print f_input.read(struct.unpack(">H", length)[0])
        length =  f_input.read(2)

小端格式

import struct

with open('test.bin', 'rb') as f_input:
    length =  f_input.read(2)

    while len(length) == 2:
        print f_input.read(struct.unpack("<H", length)[0])
        length =  f_input.read(2)

实际数据需要进一步处理。 H告诉struct将2个字节处理为unsigned short(即该值永远不会被视为负数)。

要考虑的其他事情是有时长度包括自身,所以长度为2可能意味着空信息。

答案 1 :(得分:1)

来自docs

  

对于&#39;格式字符,计数被解释为字符串的大小,而不是像其他格式字符那样的重复计数;例如,&#39; 10s&#39;意味着一个10字节的字符串,而&#39; 10c&#39;表示10个字符。如果未给出计数,则默认为1.对于打包,字符串将被截断或填充为适当的空字节以使其适合。对于解包,生成的字符串始终具有指定的字节数。作为一个特例,&#39; 0s&#39;表示单个空字符串(而&#39; 0c&#39;表示0个字符)。

's'应修改为str(msg_len)+'s'。最好先检查msg_len是否合情合理。

答案 2 :(得分:1)

尝试:

import struct

with open('abc.dat', 'rb') as f:
    while True:
        try:
            msg_len = struct.unpack('h', f.read(2))[0] # assume native byte order
            msg_data = f.read(msg_len) # just read 'msg_len' bytes
            print repr(msg_data)
        except:
            # something wrong or reach EOF
            break