【问题标题】:Writing integers in binary to file in python将二进制整数写入python中的文件
【发布时间】:2015-01-30 01:34:36
【问题描述】:

如何在 Python 3 中将整数写入二进制文件?

例如,我想将 6277101735386680763835789423176059013767194773182842284081 写入正好 24 字节的二进制文件(无符号,我只会使用正整数)。我怎样才能做到这一点?我尝试了以下方法:

struct.pack("i", 6277101735386680763835789423176059013767194773182842284081)

这会导致

ValueError: cannot fit 'int' into an index-sized integer

我尝试过使用其他一些格式(“l”、“Q”),但这些也会导致错误:

struct.error: argument out of range

如果我可以将整数精确地转换为 24 字节,我就可以写入文件,因为我知道该怎么做。但是,我似乎无法将整数转换为字节。

另外,我如何确保每个整数恰好写入 24 个字节?我也会写更小的数字(1000、2000、1598754、12),但是这些也应该占用 24 个字节。

之后如何从文件中再次读取整数?

【问题讨论】:

标签: python python-3.x io binary integer


【解决方案1】:

使用 Python 3,您可以执行以下操作:

i = 6277101735386680763835789423176059013767194773182842284081
with open('out.bin', 'wb') as file:
    file.write((i).to_bytes(24, byteorder='big', signed=False))

with open('out.bin', 'rb') as file:
    j = int.from_bytes(file.read(), byteorder='big')

print(j)

输出:

$ python3 tiny.py
6277101735386680763835789423176059013767194773182842284081

【讨论】:

  • 为什么不需要指明应该从文件中读取 24 个字节? byteorder="big" 是否已经表明了这一点?
  • 不,阅读部分没有限制。文件内容将被转换为数字。如果您只想读取前 24 个字节,请将 file.read() 替换为 file.read()[:24]byteorder='big' 是关于如何存储数字的约定en.wikipedia.org/wiki/Endianness
  • byteorder="big" 到底是什么意思?
  • 这意味着如果你在十六进制编辑器中打开文件并看到 0xFF 0x00 这意味着你写了 0xFF00 (65280)
  • 删除“byteorder="big"”参数是否会使脚本以“正常”二进制格式写入文件?既然这就是我正在寻找的(00000000=0, 00000001=1, 00000010=2, 00000011=3 等),还是“byteorder="big"” 已经这样做了?
【解决方案2】:

你可以提取最低有效字节

  x = value & 0xFF

你可以从数字中删除那个字节

  value = value >> 8

重复此过程 24 次将为您提供字节。

您还可以通过取出更多字节来加快此过程,例如使用

 x = value & 0xFFFFFFFF
 value = value >> 32

您一次处理 4 个字节。

【讨论】:

  • 可能想要chr(value & 0xFF),但我删除了我的答案以支持这个答案(并且+1'd你)(因为我错了......我没有真正正确地阅读问题)
【解决方案3】:

我最终使用了这样的东西:

def hexstring2bytes(a):
    return int(a, 16).to_bytes(len(a) // 2, byteorder='big')

hexwasm = "0061736d0100000001080260017c0060000002070101690166000003020101070501016500010a3801360044000000000000f03f4400000000000020409f440000000000c05840440000000000c05840a2a34400000000003c9140a2a310000b"

from pathlib import Path

Path("compute_pi.wasm").write_bytes(hexstring2bytes(hexwasm))

# the load that file into https://webassembly.github.io/wabt/demo/wasm2wat/

int(a, 16).to_bytes(len(a) // 2, byteorder='big')中,我将字符串的长度除以2,因为256(一个字节的信息大小)是16 ** 2(两个十六进制数字的信息大小),

【讨论】:

    猜你喜欢
    • 2013-05-29
    • 2013-10-09
    • 2014-09-29
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多