我正在使用python 3.7。由于某种原因,我的代码将二进制文件而不是二进制对象作为字符串输入读取。我不知道是什么原因造成的,而我写的内容似乎与其他人在读取二进制文件的解决方案中使用的内容相符。
import sys
filename = sys.argv[1]
with open(filename, "rb") as f:
byte = f.read(1)
while byte:
print(byte)
print(type(byte))
byte = f.read(1)
我认为这可能是由于编写二进制文件的代码是如何编写的。这是该代码:
messages=[[101,1,0,2,10,3,1,4,0],
[101,1,1,2,9,3,1,4,0],
[101,1,2,2,8,3,1,4,0],
[101,1,3,2,7,3,1,4,0],
[101,1,4,2,6,3,1,4,0],
[101,1,5,2,5,3,0,4,1],
[101,1,6,2,4,3,0,4,1],
[101,1,7,2,3,3,0,4,1],
[101,1,8,2,2,3,0,4,1],
[101,1,9,2,1,3,0,4,1],
[101,1,10,2,0,3,0,4,1]]
newFile = open("testData.bin", "wb")
for message in messages:
line=[]
for value in message:
bValue=value.to_bytes(1, byteorder='big',signed=False)
line.append(bValue)
newFile.write(bValue)
我当前的结果是第一行打印出文件的ascii值,第二行显示是字符串。
答案 0 :(得分:0)
当显示byte
的表示形式时,Python解释器将显示与byte
对应的ASCII字符,该字节的值在0-127的范围内,并且该字符可以为代表。否则,它将显示十六进制转义符。
以messages
中的第一个列表为例。
>>> m = messages[0]
>>> m
[101, 1, 0, 2, 10, 3, 1, 4, 0]
>>> bs = b''.join(x.to_bytes(1, byteorder='big', signed=False) for x in m)
>>> bs
b'e\x01\x00\x02\n\x03\x01\x04\x00'
101和10是可显示的ASCII字符
>>> chr(101)
'e'
>>> chr(10)
'\n'
因此您会在字节序列中看到ASCII等效项。 0、1、2、3和4无法显示,因此将显示十六进制转义符。