【问题标题】:Big Binary Code into File in Python在 Python 中将大二进制代码写入文件
【发布时间】:2017-01-25 08:51:45
【问题描述】:

我一直在研究一个程序,我一直在尝试转换一个大的二进制文件(作为一个字符串)并将其打包成一个文件。我已经尝试了好几天才能使这样的事情成为可能。这是我为打包大型二进制字符串而编写的代码。

binaryRecieved="11001010101....(Shortened)"
f=open(fileName,'wb')
m=long(binaryRecieved,2)
struct.pack('i',m)
f.write(struct.pack('i',m))
f.close()
quit()

我留下了错误

struct.pack('i',x)
struct.error: integer out of range for 'i' format code

我的整数超出范围,所以我想知道是否有其他方法可以解决这个问题。

谢谢

【问题讨论】:

  • 我猜你的意思是m而不是x?在那种情况下,long 对于只支持整数的东西来说太多了

标签: python file binary


【解决方案1】:

将您的位字符串转换为字节字符串:例如参见这个问题Converting bits to bytes in Python。然后用struct.pack('c', bytestring)打包字节

【讨论】:

    【解决方案2】:

    要以大端顺序对 m 进行编码(如在正常十进制使用中“十”被写为“10”),请使用:

    def as_big_endian_bytes(i):
        out=bytearray()
        while i:
            out.append(i&0xff)
            i=i>>8
        out.reverse()
        return out
    

    对于以 little-endian 顺序编码 m(如在正常十进制使用中“十”被写为“01”),请使用:

    def as_little_endian_bytes(i):
        out=bytearray()
        while i:
            out.append(i&0xff)
            i=i>>8
        return out
    

    这两个函数都适用于数字 - 就像您在问题中所做的那样 - 因此返回的字节数组可能比预期的短(因为数字前导零无关紧要)。

    对于二进制数字字符串的精确表示(只有当它的长度可被 8 整除时才有可能),您必须这样做:

    def as_bytes(s):
        assert len(s)%8==0
        out=bytearray()
        for i in range(0,len(s)-8,8):
            out.append(int(s[i:i+8],2))
        return out
    

    【讨论】:

      【解决方案3】:

      struct.pack 中,您使用了表示整数的“i”,它是有限的。正如您的代码所述,您的输出很长;因此,您可能希望使用 'd' 而不是 'i',将数据打包成双倍。它应该工作。

      请参阅Python struct 了解更多信息。

      【讨论】:

      • 虽然双精度数(几乎)在数字的大小上是无限的,但它们只能表示最大为 56 位的整数。
      • +jahbrohl 你有其他选择吗?
      • 是的,看我的回答
      猜你喜欢
      • 1970-01-01
      • 2014-09-29
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2015-07-02
      • 2020-12-16
      • 2021-11-30
      相关资源
      最近更新 更多