如何读取二进制数据并以二进制或十六进制格式打印?

时间:2020-01-23 13:19:31

标签: python encoding binary-data hexdump

我正在处理二进制数据。我有一个包含2KB二进制数据的文件。我已使用以下代码读取文件,然后打印。我也尝试在终端中使用hexdump查看文件内容。我在python和hexdump中得到相同文件的不同输出12(如所附的屏幕快照所示)。我假设这可能是由于python使用的编码方案?我对使用二进制数据非常幼稚。有人可以检查一下并让我知道原因吗?我还想知道这是否是读取大型二进制文件的正确方法?

print("First File \n");
f1 = open("/data/SRAMDUMP/dataFiles/first.bin","rb")
num1 = list(f1.read())
print(num1)
f1.close()

PythonOutput Hexdump

1 个答案:

答案 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按文件顺序打印字节。