python - 如何读取二进制数据并以二进制或十六进制格式打印?
问题描述
我正在处理二进制数据。我有一个包含 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()
解决方案
我假设这可能是由于 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
按文件顺序打印字节。
推荐阅读
- spring-boot - GraphQL:如何为 graphql spqr 和 spring boot 编写 junit 测试
- json - 使用未知字段名但已知结构解组 JSON
- r - R:将 doBy 与日期一起使用
- rollup - 使用 rollup-plugin-postcss 生成的 ESM 库抛出找不到模块 '../node_modules/style-inject/dist/style-inject.es.js'
- c - C编程,递归
- javascript - ASP.NET MVC - 从控制器调用 AJAX
- flutter - 在颤振中实现自定义标签栏
- google-cloud-platform - Cloud Function 始终使用默认服务帐户 (Terraform)
- java - 禁用自动索引创建但保留 @Indexed 注释的效果
- reactjs - 通过 Django websockets 将更新数据传输到客户端的正确方法是什么?