首页 > 解决方案 > 如何读取二进制数据并以二进制或十六进制格式打印?

问题描述

我正在处理二进制数据。我有一个包含 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()

Python输出 十六进制转储

标签: pythonencodingbinary-datahexdump

解决方案


我假设这可能是由于 python 使用的编码方案?

没有“编码方案” hexdump 将二进制数据格式化为十六进制(每个字节两个半字节),您已将文件的二进制内容转换为一个列表,该列表产生一个整数列表(因为这就是 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按文件顺序打印字节。


推荐阅读