将4个整数打包为一个字节?

2024-04-23 22:08:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有四个整数{{},bcd},它们的值范围如下:

a-{0或1}(1位)

b-{0或1}(1位)

c-{0,1,2,…,7}(3位)

d-{0,1,2,…,7}(3位)

首先,我想把它们打包成一个字节,然后再写入二进制文件。 稍后,我想将这一字节解压并从中得到一个形式为(abcd)的元组。在

我知道如何在python中对二进制文件读/写一个字节。但是我该怎么包装呢?在


Tags: 文件字节二进制整数形式元组
3条回答

如果你经常需要这样的东西,那么位移会变得乏味和容易出错。有第三方库可以帮助-我写了一个名为bitstring

打包并转换为字节:

x = bitstring.pack('2*uint:1, 2*uint:3', a, b, c, d).bytes

打开包装:

^{pr2}$

对于您的例子来说,这可能有点过头了,但当事情变得更复杂时,它会有所帮助。在

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:

^{pr2}$

说明:最初,你有

0000000a
0000000b
00000ccc
00000ddd

左边班给你

0000000a
000000b0
000ccc00
ddd00000

按位OR的结果是

dddcccba

转换为字符会将其转换为单个字节。在

拆包:四种不同的右移导致

dddcccba
0dddcccb
00dddccc
00000ddd

10b00000001)或70b00000111)掩蔽(按位与)会导致

0000000a
0000000b
00000ccc
00000ddd

再说一遍。在

相关问题 更多 >