簡體   English   中英

如何打包和解壓縮64位數據?

[英]How to pack & unpack 64 bits of data?

我有一個64位數據結構,如下所示:

HHHHHHHHHHHHHHHHGGGGGGGGGGGGFFFEEEEDDDDCCCCCCCCCCCCBAAAAAAAAAAAA

A:12位(無符號)
B:1位
C:12位(無符號)
D:4位(無符號)
E:4位(無符號)
F:3位(無符號)
G:12位(無符號)
H:16位(無符號)

使用Python,我試圖確定我應該使用哪個模塊(最好是本機Python 3.x)。 我正在查看BitVector,但無法弄清楚某些事情。

為了易於使用,我希望能夠執行以下操作:

# To set the `A` bits, use a mapped mask 'objectId'
bv = BitVector(size=64)
bv['objectId'] = 1

我不確定BitVector是否確實按照我想要的方式工作。 無論我最終實現什么模塊,數據結構都將封裝在一個類中,該類通過屬性getter / setter對該結構進行讀寫。

我還將對某些位值使用常量(或枚舉),並且能夠使用類似以下的方式設置映射的掩碼會很方便:

# To set the 'B' bit, use the constant flag to set the mapped mask 'visibility'
bv['visibility'] = PUBLIC  
print(bv['visibility']) # output: 1  

# To set the 'G' bits, us a mapped mask 'imageId'
bv['imageId'] = 238  

3.x中是否有Python模塊可以幫助我實現這一目標? 如果BitVector能夠(或應該)起作用,將感謝一些有用的提示(例如示例)。 似乎BitVector希望將所有內容強制為8位格式,這對於我的應用程序(IMHO)而言並不理想。

基於使用位數組的建議,我提出了以下兩種實用方法的實現:

def test_bitvector_set_block_id_slice(self):
    bv = bitvector(VECTOR_SIZE)
    bv.setall(False)

    print("BitVector[{len}]: {bv}".format(len=bv.length(),
                                          bv=bv.to01()))
    print("set block id: current {bid} --> {nbid}".format(bid=bv[52:VECTOR_SIZE].to01(),
                                                          nbid=inttobitvector(12, 1).to01()))

    # set blockVector.blockId (last 12 bits)
    bv[52:VECTOR_SIZE] = inttobitvector(12, 1)

    block_id = bv[52:VECTOR_SIZE]

    self.assertTrue(bitvectortoint(block_id) == 1)
    print("BitVector[{len}] set block id: {bin} [{val}]".format(len=bv.length(),
                                                                bin=block_id.to01(),
                                                                val=bitvectortoint(block_id)))
    print("BitVector[{len}]: {bv}".format(len=bv.length(),
                                          bv=bv.to01()))
    print()

# utility methods
def bitvectortoint(bitvec):
    out = 0
    for bit in bitvec:
        out = (out << 1) | bit

    return out


def inttobitvector(size, n):
    bits = "{bits}".format(bits="{0:0{size}b}".format(n,
                                                      size=size))

    print("int[{n}] --> binary: {bits}".format(n=n,
                                               bits=bits))

    return bitvector(bits)

輸出如下:

BitVector[64]: 0000000000000000000000000000000000000000000000000000000000000000
int[1] --> binary: 000000000001
set block id: current 000000000000 --> 000000000001
int[1] --> binary: 000000000001
BitVector[64] set block id: 000000000001 [1]
BitVector[64]: 0000000000000000000000000000000000000000000000000000000000000001

如果對實用程序方法有所改進,我很樂意聽取一些建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM