如何在python中将4个9位和1个4位int变量打包成5个8位变量?
how to pack 4 9-bit and 1 4-bit int variable into 5 8-bit variable in python?
我在 0~0x1FF(9-bit)
之间有 4 个变量,在 0~0xF(4-bit)
之间有 1 个变量,我想将它们打包成二进制文件。像往常一样,我将前四个用 pack('H', var)
(unsigned short, 16-bit) 打包,然后用 pack('B', var)
(unsigned char, 8-bit).
所以我会花费 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位变量?
自己打包:
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。
我在 0~0x1FF(9-bit)
之间有 4 个变量,在 0~0xF(4-bit)
之间有 1 个变量,我想将它们打包成二进制文件。像往常一样,我将前四个用 pack('H', var)
(unsigned short, 16-bit) 打包,然后用 pack('B', var)
(unsigned char, 8-bit).
所以我会花费 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位变量?
自己打包:
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。