Python读取二进制文件并解码

4

我是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
是的,你可以使用 seek() - 2rs2ts
要将字节转换为二进制字符串(如“0110101001”等),请参见https://dev59.com/eWoy5IYBdhLWcg3wCpoz。 - DNA
谢谢,但也许我发布了错误的示例。现在使用seek()函数,我可以移动文件指针,如果我执行gps_time = navatt_file.read(1),屏幕上会出现>符号,这是正确的。因此,我认为问题在于将ASCII转换为二进制或整数。我该怎么做呢? - rduca
1个回答

2

字节数组

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

以下是使用字节串的示例:

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,并将它们作为二进制/二进制字符串打印出来。
因此,这里是一个简短的示例,演示如何输出标题(我从名为“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不会显示任何不必要的零。
如果您是该语言的新手,最后一行可能看起来相当复杂。它使用列表推导式来制作我们想要打印的所有二进制字符串的列表,然后使用元素之间的空格将它们连接成最终字符串。
更少Python化/复杂的最后一行变体将是:
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)

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接