【问题标题】:How to properly serialize a python bitarray?如何正确序列化 python 位数组?
【发布时间】:2016-06-23 21:13:43
【问题描述】:

简单地使用 tobytes 和 frombytes 方法并不总是给出如下所示的等价对象。

这似乎源于源位数组的长度不能被八整除。

from bitarray import bitarray  # pip install bitarray


foo = bitarray('0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000010000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000010000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000010000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '0000000000000000000000000000000000000000000000000000000000'
               '000000000000000000000000000000000000000000000001000000',
               endian="little")


bar = bitarray(endian="little")
bar.frombytes(foo.tobytes())
assert(foo.tobytes() == bar.tobytes())  # passes
assert(foo == bar)  # fails

【问题讨论】:

    标签: python serialization bitarray


    【解决方案1】:

    解决办法是保存长度,修剪反序列化的bitarray。

    from bitarray import bitarray  # pip install bitarray
    import json
    from base64 import b64encode, b64decode
    
    
    def serialize(ba):
        return json.dumps({
            "endian": ba.endian(),
            "bytes": b64encode(ba.tobytes()),
            "len": len(ba)
        })
    
    
    def deserialize(data):
        data = json.loads(data)
        ba = bitarray(endian=data["endian"])
        ba.frombytes(b64decode(data["bytes"]))
        return ba[:data["len"]]
    
    
    foo = bitarray('0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000010000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000010000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000010000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '0000000000000000000000000000000000000000000000000000000000'
                   '000000000000000000000000000000000000000000000001000000',
                   endian="little")
    
    
    bar = deserialize(serialize(foo))
    assert(foo.tobytes() == bar.tobytes())
    assert(foo == bar)
    

    【讨论】:

      【解决方案2】:

      您可以使用 bitarray python 模块直接保存和加载 bitarray

      # Save bitarray
      ba = bitarray('11100000')
      with open('bitarray.bin', 'wb') as f:
              ba.tofile(f)
      
      # Load bitarray
      ba = bitarray()
      with open('bitarray.bin', 'rb') as f:
              ba.fromfile(f)
      

      【讨论】:

        猜你喜欢
        • 2021-01-22
        • 1970-01-01
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        相关资源
        最近更新 更多