我正在处理二进制数据。我有一个包含2KB二进制数据的文件。我已使用以下代码读取文件,然后打印。我也尝试在终端中使用hexdump查看文件内容。我在python和hexdump中得到相同文件的不同输出1和2(如所附的屏幕快照所示)。我假设这可能是由于python使用的编码方案?我对使用二进制数据非常幼稚。有人可以检查一下并让我知道原因吗?我还想知道这是否是读取大型二进制文件的正确方法?
print("First File \n");
f1 = open("/data/SRAMDUMP/dataFiles/first.bin","rb")
num1 = list(f1.read())
print(num1)
f1.close()
答案 0 :(得分:1)
我假设这可能是由于python使用的编码方案造成的?
没有“编码方案”十六进制转储将二进制数据格式化为十六进制(每个字节两个半字节),您已将文件的二进制内容转换为一个列表,该列表产生一个整数列表(因为这就是python中的字节数) )。
如果要在Python中将字节转换为可打印的十六进制,请使用bytes.hex方法。如果您想要类似于hexdump的东西,则需要注意切片,间距和回车。
慢速版本会简单地每2个字节读取2个字节的文件,将其十六进制打印,然后每16个字节换行。 Python 3.8在bytes.hex()中添加了格式化工具,这意味着您甚至可以更轻松地读取带有两个分隔符的16 x 16字节,尽管这与hexdump的格式不完全匹配:
f = open(sys.argv[1], 'rb')
it = iter(functools.partial(f.read, 16), '')
for i, b in enumerate(it):
print(f'{16*i:07x} {b.hex(" ", 2)}')
还要注意,hexdump
默认情况下遵循平台的字节序,这是...很少需要的内容,并且与Python输出不匹配。 hexdump -C
按文件顺序打印字节。