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

17 投票
5 回答
2938 浏览
提问于 2025-04-16 13:40

我有四个整数,分别是 abcd,它们的取值范围如下:

a - 只能是 0 或 1(1 位)

b - 只能是 0 或 1(1 位)

c - 可以是 0 到 7 之间的任意整数(3 位)

d - 也可以是 0 到 7 之间的任意整数(3 位)

一开始,我想把这四个数打包成一个字节,这样就可以写入一个二进制文件。之后,我想把这个字节解包,得到一个形如 (abcd) 的元组。

我知道怎么在 Python 中读写一个字节到二进制文件里,但我不知道怎么进行位的打包和解包。

5 个回答

5

如果你经常需要做这种事情,使用位移操作可能会变得很麻烦,而且容易出错。其实有一些第三方库可以帮你解决这个问题——我写了一个叫做 bitstring 的库:

用来打包并转换成字节:

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

还有用来解包的:

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

虽然对于你的例子来说,这可能有点过于复杂,但在事情变得更复杂时,它会很有帮助。

10

这段代码是用来处理一些数据的。它的主要目的是从一个地方获取信息,然后对这些信息进行一些操作,最后把结果输出。具体来说,它可能会从数据库或者文件中读取数据,然后进行计算或转换,最后把处理后的数据展示出来。

在编程中,通常会用到一些循环和条件判断来确保代码能够正确运行。比如,如果数据符合某个条件,就执行某个操作;如果不符合,就执行另一个操作。这种方式可以让程序更加灵活,能够处理不同的情况。

总的来说,这段代码的功能就是获取、处理和输出数据,虽然具体的实现方式可能会有所不同,但大致的思路是这样的。

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
32

使用左移和按位或运算,然后转换成字符,就能得到一个“字节”:

x = chr(a | (b << 1) | (c << 2) | (d << 5))

要把这个字节再解包,首先要转换成整数,然后进行右移和按位与运算:

i = ord(x)
a = i & 1
b = (i >> 1) & 1
c = (i >> 2) & 7
d = (i >> 5) & 7

解释:最开始,你有

0000000a
0000000b
00000ccc
00000ddd

左移操作会得到

0000000a
000000b0
000ccc00
ddd00000

按位或运算的结果是

dddcccba

转换成字符后,这个结果会变成一个单独的字节。

解包:四次不同的右移操作会得到

dddcccba
0dddcccb
00dddccc
00000ddd

用按位与运算(也就是与运算)和 1 (0b00000001) 或 7 (0b00000111) 会得到

0000000a
0000000b
00000ccc
00000ddd

再次得到。

撰写回答