如何读取二进制数据并以二进制或十六进制格式打印?
How to read binary data and print in binary or hexadecimal format?
我正在处理二进制数据。我有一个包含 2KB 二进制数据的文件。我使用以下代码读取文件然后打印它。我还尝试在终端中使用 hexdump 查看文件内容。我在 python 和 hexdump 中得到同一文件的不同输出 1 and 2(如所附的屏幕截图所示)。我假设这可能是由于 python 使用的编码方案?我对使用二进制数据非常天真。任何人都可以检查一下并让我知道这是什么原因吗?我还想知道这是否是读取大型二进制文件的正确方法?
print("First File \n");
f1 = open("/data/SRAMDUMP/dataFiles/first.bin","rb")
num1 = list(f1.read())
print(num1)
f1.close()
I am assuming it might be due to the encoding scheme used by python?
没有 "encoding scheme" hexdump 将二进制数据格式化为十六进制(每个字节两个半字节),您已将文件的二进制内容转换为一个列表,该列表产生一个整数列表(因为这就是字节在 python).
如果要将 Python 中的字节转换为可打印的十六进制,请使用 bytes.hex 方法。如果你想要类似于 hexdump 的东西,你需要注意切片、间距和回车-return-ing。
慢速版本会简单地每 2 个字节读取文件 2 个字节,将它们十六进制,打印它们,然后每 16 个字节换行。 Python 3.8 为 bytes.hex() 添加了格式化工具,这意味着您可以更轻松地读取 16 字节到 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
按文件顺序打印字节。
我正在处理二进制数据。我有一个包含 2KB 二进制数据的文件。我使用以下代码读取文件然后打印它。我还尝试在终端中使用 hexdump 查看文件内容。我在 python 和 hexdump 中得到同一文件的不同输出 1 and 2(如所附的屏幕截图所示)。我假设这可能是由于 python 使用的编码方案?我对使用二进制数据非常天真。任何人都可以检查一下并让我知道这是什么原因吗?我还想知道这是否是读取大型二进制文件的正确方法?
print("First File \n");
f1 = open("/data/SRAMDUMP/dataFiles/first.bin","rb")
num1 = list(f1.read())
print(num1)
f1.close()
I am assuming it might be due to the encoding scheme used by python?
没有 "encoding scheme" hexdump 将二进制数据格式化为十六进制(每个字节两个半字节),您已将文件的二进制内容转换为一个列表,该列表产生一个整数列表(因为这就是字节在 python).
如果要将 Python 中的字节转换为可打印的十六进制,请使用 bytes.hex 方法。如果你想要类似于 hexdump 的东西,你需要注意切片、间距和回车-return-ing。
慢速版本会简单地每 2 个字节读取文件 2 个字节,将它们十六进制,打印它们,然后每 16 个字节换行。 Python 3.8 为 bytes.hex() 添加了格式化工具,这意味着您可以更轻松地读取 16 字节到 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
按文件顺序打印字节。