[英]Python: Get bits from an list of integers and fill a bytearray
我正在嘗試在 python 中通過調用特定的外部庫(即 sys + math)將整數列表的最后 2 位獲取到字節數組並打印字節數組。 基本上我正在嘗試將 python 用於Elias-Fano 壓縮方法。
問題是我不能把它們放在字節數組中......到目前為止我得到了這個:
import sys
import math
OriginalList = []
with open(sys.argv[1], 'r') as file:
OriginalList = [line.rstrip() for line in file]
maxList = int(max(OriginalList))
numList = len(OriginalList)
l = math.floor(math.log2(maxList/numList))
print ("L = " + str(l))
L = bytearray()
for x in OriginalList:
a = bin(x)[(-1-l):-1]
L.append(a)
print ("L array")
for x in L_array:
print(x)
我不確定您為什么要為此使用字節數組,因為您需要連接不同大小的位字段。 這是一個僅使用移位和掩碼進行位操作並將結果存儲在單個變量中的解決方案。 請記住,Python 整數可以是任意大小。
您可以看到第一個循環構建了編碼的第一部分,我們在其中對具有前綴的元素數量進行編碼。 第二個循環添加固定大小的剩菜。
import sys
import math
#OriginalList = []
#with open(sys.argv[1], 'r') as file:
# OriginalList = [int(line.rstrip()) for line in file]
OriginalList = (2,3,5,7,11,13,24)
maxList = max(OriginalList)
numList = len(OriginalList)
m = math.ceil(math.log2(maxList))
n = math.ceil(math.log2(numList))
l = m-n
mask_n = (1<<n)-1
mask_l = (1<<l)-1
mycopy = list(OriginalList)
bits = 0
for i in range(1<<n):
while mycopy and ((mycopy[0]>>l) & mask_n) == i:
bits = (bits << 1) + 1
mycopy.pop(0)
bits <<= 1
for i in OriginalList:
bits = (bits << l) | (i & mask_l)
print(bin(bits))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.