【问题标题】:How to read binary data and print in binary or hexadecimal format?如何读取二进制数据并以二进制或十六进制格式打印?
【发布时间】:2020-05-09 18:48:43
【问题描述】:

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


    【解决方案1】:

    我假设这可能是由于 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 按文件顺序打印字节。

    【讨论】:

    • 感谢您的回答。我已经尝试了代码,但出现以下错误。回溯(最后一次调用):文件“/data/pythonScripts/readBinaryData/readDataTest.py”,第 8 行,在 print(f'{16*i:07x} {b.hex(" ", 2) }') TypeError: hex() 不带参数(给定 2 个)
    • 如评论中所述,格式化参数是在 Python 3.8 中添加的。如果您运行的是旧版本,则必须手动格式化。
    猜你喜欢
    • 2013-03-31
    • 2022-11-29
    • 1970-01-01
    • 2020-10-25
    • 2014-10-30
    • 1970-01-01
    • 2018-11-28
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多