【发布时间】:2020-12-29 12:24:19
【问题描述】:
我正在编写一个代码,用于读取二进制文件并将其数据的十六进制表示形式打印为 csv,使用 NULL 值作为分隔符。在二进制/十六进制查看器中查看文件时,它会将此序列显示为文件的一部分:
41 73 73 65 6d 62 6c 79 c8 2d 01 00 04 00 00 00 07 00 00 00 00
但是,使用这部分代码读取文件:
with open(file_in, "rb") as f:
while (byte := f.read(1)):
h_value = hex(ord(byte))
h_value = ("0" + h_value[2:])[-2:]
#print(byte)
#print(h_value)
if h_value != '00':
data_read.append(h_value)
else:
data_read.append(h_value)
if data_read:
with open(file_out, 'a', newline = '') as c:
w = csv.writer(c)
w.writerow(data_read)
data_read = []
在那个部分给我这个:
41,73,73,65,6d,62,6c,79,c3,88,2d,01,20,04,20,20,20,07,20,20,20,20
这是相关的,因为文件中其他地方有实际的“20”值作为数据。使用“print(byte)”和“print(h_value)”分别返回b' '和20,这让我认为是Python 读取文件错误,而不仅仅是转换的输出.我可以做些什么来在整个过程中保留这些 NULL 值吗?
编辑 1:附加信息,这是使用 IDLE 运行 Python 3.8.2。不知道编译器是否会对此有所作为,但我将看看 Visual Studio 是否会给我不同的结果。二进制查看器简称为 Binary Viewer,版本 6.17。
【问题讨论】:
-
看起来您的数据在某些时候被几个额外的处理层破坏了,包括空值到空格的转换和尝试 UTF-8 编码(注意 c8 字节发生了什么) .我们不知道这些额外的处理层发生在哪里,也不知道您需要更改什么来阻止它们发生。
-
@user2357112supportsMonica 在你指出之前我什至没有注意到 c8 字节的变化,但看起来我也找到了地址的解决方案。