问题描述
我正在尝试使用以下格式读取二进制文件
with open("binaryfile.bin",'rb') as f1:
for line in f1.readlines():
print(line)
它返回类似乱码的数据
@ ç─+@@@d*d)
⌡Å2
q_ Ç
我已验证文件中的数据正确,并且可以在命令行上使用od命令读取它
od -w8 -Ad -x binaryfile.bin
输出:
0000000 0011 0022 0066 0066
0000008 0066 0066 0066 0066
*
0000032 1234 0000 0000 0000
0000040 0000 0000 0000 0000
*
0000080 0000 0000 0000 0056
0000088 0011
'od'命令的问题在于,当两行或多行连续相似时,它将替换为“ * \ n” 。如果我每行仅读取两个字节(因为更多数据是常见的),则此问题会变得更加普遍。
od -w2 -Ad -x binaryfile.bin
输出:
0000000 0011
0000002 0022
0000004 0066
*
0000032 1234
0000034 0000
*
0000086 0056
0000088 0011
我想阅读每一行。
Q1:谁能建议为什么正常的'rb'命令不起作用?
Q2:是否可以选择使用'ob'命令读取整个文件而不删除公共行?
解决方法
open("binaryfile.bin",'rb')
正常工作,它读取以字节为单位的数据,然后将这些信息打印到控制台,并尝试将这些字节块转换为'utf-8'格式并产生奇怪的字符,因为您不是在读取文本文件。
您可以使用binascii.hexify
方法将字节字符串转换为所需的十六进制表示形式:
import binascii
with open("binaryfile.bin",'rb') as f1:
for line in f1.readlines():
# NOTE: arguments 'sep' and 'bytes_per_sep' are only since Python v3.8
print(binascii.hexlify(line,sep=' ',bytes_per_sep=2))