如何在python中将4个9位和1个4位int变量打包成5个8位变量?

时间:2016-03-19 16:53:57

标签: python bit pack

我在0~0x1FF(9-bit)0~0xF(4-bit)之间的1个变量之间有4个变量,我想将它们打包成二进制。像往常一样,我会将前四个打包为pack('H', var)无符号短,16位),然后打包最后一个pack('B', var) unsigned char,8位)。

所以我需要花费72 bits

16 * 4 + 8 = 72

我面临一个特殊的情况:我的存储非常珍贵,我只需要40位:

4 * 9 + 1 * 4

我浪费了32位,而这些32位对我来说也很重要,因为我有很多数据要打包,每次浪费32位,最后,我的存储空间向我抱怨。

实际上,我可以将4个9位变量和1个4位变量转换为5个8位变量(unsigned char),然后用pack('B', var)将它们全部打包,当然我保存了32位。

4 * 9 + 1 * 4 == 5 * 8

如何简单地更改pack 4 9位变量和1个4位变量int 5 8位变量?

1 个答案:

答案 0 :(得分:2)

自己打包:

import struct
ninebits = [0b110011001,0b000000000,0b111111111,0b010101010]
fourbit = 0b1010
pack = 0
for i,v in enumerate(ninebits):
    pack <<= 9
    pack |= v
pack <<= 4
pack |= fourbit
print('{:040b}'.format(pack))
print('{:010X}'.format(pack))
print(struct.pack('>LB',pack >> 8, pack & 0xFF))

输出:

1100110010000000001111111110101010101010
CC803FEAAA
b'\xcc\x80?\xea\xaa'

请注意,?\x3f的ASCII码。