Python读取二进制文件并解码

时间:2014-04-11 15:14:12

标签: python python-2.7

我是python的新手,我需要解决这个简单的问题。已经有几个类似的问题,但我仍然无法解决它 我需要读取一个二进制文件,它由几个字节块组成。例如,标题由6个字节组成,我想提取这6个字节并转换二进制字符序列,例如000100110 011001。

navatt_dir='C:/PROCESSING/navatt_read/'
navatt_filename='OSPS_FRMT_NAVATT____20130621T100954_00296_caseB.bin'
navatt_path=navatt_dir+navatt_filename

navatt_file=open(navatt_path, 'rb')
header=list(navatt_file.read(6))
print header

作为列表的结果,我有以下

%run C:/PROCESSING/navatt_read/navat_read.py
['\t', 'i', '\xc0', '\x00', '\x00', 't']

这不是我想要的。
我还想知道位置和长度的二进制文件中的特定值,而不读取所有文件。是否有可能 感谢

1 个答案:

答案 0 :(得分:0)

的ByteArray

bytearray是一个可变的字节序列(整数,其中0≤x≤255)。您可以从字符串构造bytearray(如果它不是字节字符串,则必须提供编码),可迭代的字节大小的整数或具有缓冲区接口的对象。你当然也可以手动构建它。

使用字节串的示例:

string = b'DFH'
b = bytearray(string)

# Print it as a string
print b

# Prints the individual bytes, showing you that it's just a list of ints
print [i for i in b]

# Lets add one to the D
b[0] += 1

# And print the string again to see the result!
print b

结果:

DFH
[68, 70, 72]
EFH

如果您想要原始字节操作,这是您想要的类型。如果您想要的是将4个字节作为32位int读取,则可以使用struct模块,使用unpack方法,但我通常只是将它们从bytearray中转移到一起。

以二进制打印标题

你似乎想要的是获取你拥有的字符串,将其转换为bytearray,并将它们打印为基数为2 /二进制的字符串。

所以这里有一个简短的例子来说明如何写出标题(我从名为“dump”的文件中读取随机数据):

with open('dump', 'rb') as f:
    header = f.read(6)

b = bytearray(header)

print ' '.join([bin(i)[2:].zfill(8) for i in b])

在将其转换为bytearray之后,我在每一个上调用bin(),它返回一个字符串,其中包含我们需要的二进制表示,格式为“0b1010”。我不想要“0b”,所以我用[2:]将其切掉。然后,我使用字符串方法zfill,它允许我为字符串预先设置所需的0的数量为8长(这是我们需要的位数),因为bin不会显示任何不需要的零。

如果您是该语言的新手,最后一行可能看起来很平均。它使用列表推导来列出我们想要打印的所有二进制字符串,然后将它们连接到最终字符串中,并在元素之间留出空格。

最后一行的较少pythonic / convoluted变体将是:

result = []
for byte in b:
    string = bin(i)[2:] # Make a binary string and slice the first two bytes
    result.append(string.zfill(8)) # Append a 0-padded version to the results list

# Join the array to a space separated string and print it!
print ' '.join(result)

我希望这有帮助!