Skip to main content

TA 模块将数组转换为位域数组。通常用于通过网络传输数组和结构。

项目描述

位域数组

当您想通过网络传输/接收数组和结构等时,这种事情很有用。例如,您可以将数组[False, True, True, True, True, True, False]转换为数字 62,然后您可以使用按位运算符或使用此模块访问它。

class BitFieldArray

此类表示一个位域数组,每个位域包含一个值和要在数组中获取的最大位数。

参数

*字段:一个元组int。确定数组中的位分布。

方法:

def assign(self, values: typing.Iterable[int]):
def assign(self, value: int):
  • 您可以使用此函数将位域分配到数组中。此函数可以接受将分配给第一个空位域的单个值,或将一个一个地分配给第一个空位域及更远的一系列值。

参数

value:单个值或一系列值。


def delete(self, index):
  • 从数组中删除一个位域。

参数:

index: int,要删除的位域的索引。


def export(self):
  • 将数组导出为整数,以后可以使用它来访问索引。您可以通过以下方式访问任何索引 (array >> SHIFT_RIGHT_X_BITS) & ((1 << BITS) - 1)
array = BitFieldArray(3, 7, 8, 9)
array.assign([5, 6, 7, 8])
number = array.export()
print((number >> 0) & ((1 << 3) -1)) # 5
print((number >> 3) & ((1 << 7) -1)) # 6
print((number >> 10) & ((1 << 8) -1)) # 7
print((number >> 18) & ((1 << 9) -1)) # 8

0 是我们第一次访问数组,我们不需要移位它。

然后我们将它移动 3 位,因为最后一个是 3 位。

然后我们将其移动 10 位,因为后者是 3+7 位,依此类推。

目标是移开我们需要的特定值之前的值,这样它将是我们需要访问的第一个值。您可以>>=每次都使用,然后您不需要像 3+7 那样对前一个值的位求和。

number = array.export()
for i in (3, 7, 8, 9): # bits in the structure
    print(number & (1 << i) -1)
    number >>= i

最终数字将是 0 - 消耗的数组。


def export_as_bytes(self, order):
  • 将数组导出为字节。例如,通过网络发送。

参数:

order:字节的字节序。必须是“小”或“大”。您可以使用本机订单 - sys.byteorder


def to_list(self):
  • 将数组作为数组中值的列表返回。

def from_int(self, value: int):
  • array.export()您可以创建一个指定位分布的数组实例,然后使用该数字调用此方法,而不是手动访问具有结果数的索引。

例如:

# 7 boolean flags, the first and last are True and the rest are False.
flags = BitFieldArray(1, 1, 1, 1, 1, 1, 1)
flags.from_int(62)
print(flags.to_list())

结果在[0, 1, 1, 1, 1, 1, 0].

参数

value: int,创建实例的编号。


def from_bytes(self, value: bytes, order: str):
  • 与 BitFieldArray.from_int 相同,但用于字节。通常在通过网络发送数组时使用。

价值:bytes。从中创建实例的字节。

order: str,字节的字节序。必须是“小”或“大”。您可以使用本机顺序 - sys.byteorder。


例子

from BitFieldArray import BitFieldArray

array = BitFieldArray(1, 1, 1, 1)
array.assign(False)
array.assign(False)
array.assign([True, True])

print(array)
print(array.export())

将返回<BitFieldArray [00000000: 1, 00000000: 1, 00000001: 1, 00000001: 1]>,并且exporting 将返回 12。


from BitFieldArray import BitFieldArray

array = BitFieldArray(30, 16, 16, 2) # 64 bit array, 8 byte.
array.assign([999888777, 12345, 56789, 3])
print(array)
print(array.export())

它会打印出来 <BitFieldArray [00111011100110010001011110001001: 30, 0011000000111001: 16, 1101110111010101: 16, 00000011: 2]>,然后17831241924730230665

数字 17831241924730230665 是数组本身,可以使用按位运算符访问,如方法中所述export

它也可以与from_int.


from BitFieldArray import BitFieldArray
from sys import byteorder

array = BitFieldArray(10, 10, 10, 10, 12, 12, 12, 12) # 88 bit array
array.assign([550, 600, 650, 700, 1000, 2000, 3000, 4000])
print(array.export_as_bytes(byteorder))

将导致b'&b\xa9(\xaf\xe8\x03}\xb8\x0b\xfa'. 然后你可以做

from BitFieldArray import BitFieldArray
from sys import byteorder

array = BitFieldArray(10, 10, 10, 10, 12, 12, 12, 12) # 88 bit array
obj = array.from_bytes(b'&b\xa9(\xaf\xe8\x03}\xb8\x0b\xfa', byteorder)
print(obj)
print(obj.to_list())

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

BitFieldArray-1.0.3.tar.gz (4.4 kB 查看哈希

已上传 source

内置分布

BitFieldArray-1.0.3-py3-none-any.whl (5.5 kB 查看哈希

已上传 py3