2024-04-23 22:08:22 发布
网友
我有四个整数{{},b,c,d},它们的值范围如下:
b
c
d
a-{0或1}(1位)
a
b-{0或1}(1位)
c-{0,1,2,…,7}(3位)
d-{0,1,2,…,7}(3位)
首先,我想把它们打包成一个字节,然后再写入二进制文件。 稍后,我想将这一字节解压并从中得到一个形式为(a,b,c,d)的元组。在
我知道如何在python中对二进制文件读/写一个字节。但是我该怎么包装呢?在
如果你经常需要这样的东西,那么位移会变得乏味和容易出错。有第三方库可以帮助-我写了一个名为bitstring:
打包并转换为字节:
x = bitstring.pack('2*uint:1, 2*uint:3', a, b, c, d).bytes
打开包装:
对于您的例子来说,这可能有点过头了,但当事情变得更复杂时,它会有所帮助。在
def encode(a, b, c, d): return a | b << 1 | c << 2 | d << 5 def decode(x): return x & 1, (x >> 1) & 1, (x >> 2) & 7, (x >> 5) & 7
使用shift和位OR,然后转换为字符以获得“字节”:
x = chr(a | (b << 1) | (c << 2) | (d << 5))
若要再次解压缩此字节,请先将其转换为整数,然后使用shift并使用按位and:
说明:最初,你有
0000000a 0000000b 00000ccc 00000ddd
左边班给你
0000000a 000000b0 000ccc00 ddd00000
按位OR的结果是
dddcccba
转换为字符会将其转换为单个字节。在
拆包:四种不同的右移导致
dddcccba 0dddcccb 00dddccc 00000ddd
用1(0b00000001)或7(0b00000111)掩蔽(按位与)会导致
1
0b00000001
7
0b00000111
再说一遍。在
如果你经常需要这样的东西,那么位移会变得乏味和容易出错。有第三方库可以帮助-我写了一个名为bitstring:
打包并转换为字节:
打开包装:
^{pr2}$对于您的例子来说,这可能有点过头了,但当事情变得更复杂时,它会有所帮助。在
使用shift和位OR,然后转换为字符以获得“字节”:
若要再次解压缩此字节,请先将其转换为整数,然后使用shift并使用按位and:
^{pr2}$说明:最初,你有
左边班给你
按位OR的结果是
转换为字符会将其转换为单个字节。在
拆包:四种不同的右移导致
用
1
(0b00000001
)或7
(0b00000111
)掩蔽(按位与)会导致再说一遍。在
相关问题 更多 >
编程相关推荐