簡體   English   中英

從8位數組轉換為5位數組

[英]Convert from 8 bits array to 5 bits array

python是否有簡單的方法將8位轉換為5位。 目前,我正在使用此代碼執行此操作:

def convertbits(data, frombits, tobits, pad=True):
    acc = 0
    bits = 0
    ret = []
    maxv = (1 << tobits) - 1
    max_acc = (1 << (frombits + tobits - 1)) - 1
    for value in data:
        if value < 0 or (value >> frombits):
            return None
        acc = ((acc << frombits) | value) & max_acc
        bits += frombits
        while bits >= tobits:
            bits -= tobits
            ret.append((acc >> bits) & maxv)
    if pad:
        if bits:
            ret.append((acc << (tobits - bits)) & maxv)
    elif bits >= frombits or ((acc << (tobits - bits)) & maxv):
        return None
    return ret

有沒有更好的辦法?

編輯:輸出應為5位整數列表,而不會丟失過程中的任何數據

它應該像這樣工作:

>>> hello = [ord(letter) for letter in 'hello']
>>> hello
[104, 101, 108, 108, 111]
>>> convertbits(hello, 8, 5)
[13, 1, 18, 22, 24, 27, 3, 15]
>>> 

嗯,這是相對低效的內存,因為它將單個位轉換為字符串,但似乎可以正常工作:

import itertools  

def convertbits(data, From, To):
    bits_orig = itertools.chain.from_iterable(bin(n)[2:].zfill(From) for n in data)

    chunks = iter(lambda: ''.join(itertools.islice(bits_orig, To)), '')

    return [int(n, 2) for n in chunks]


print(convertbits(b'hello', 8, 5))
print([13, 1, 18, 22, 24, 27, 3, 15])

一旦獲得一串數字位( bits_orig ),就可以很容易地將此​​流切成等長的chunkschunks )(此版本不進行填充,但實現起來相當簡單)並轉換成一串和零回到數字。


如果僅使用8位數字,則此算法比上述算法快8.5 (!)倍:

from collections import deque 

def convert8bits(data, To):
    number = int.from_bytes(data, 'big')

    ret = deque()
    th = (1 << To) - 1
    while number:
        ret.appendleft(number & th)
        number >>= To

    return ret

暫無
暫無

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

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