在Python中将“字节”对象分成块

Sta*_*ute 3 python sockets tcp python-3.x

我需要使用TCP ProtocolPython的socket模块通过特定长度(比如40字节)的“包”发送一个数组。首先,我生成以下示例数组ints

int_array = [i**2 for i in range(1, 100)]
Run Code Online (Sandbox Code Playgroud)

然后我将其转换为bytes对象:

encoded_array = str(int_array).encode()
Run Code Online (Sandbox Code Playgroud)

为了检查encoded_array我正在使用的对象的长度len(encoded_array),在这种特殊情况下等于 551 字节。

假设我想发送 40 字节长的包:这使得 13 个包和最后一个字节的剩余部分encoded_array总共 14 个包。但我无法弄清楚如何按字节数本身将bytes对象划分为更小的对象的方法。bytes有谁知道如何做到这一点?

我也知道我可能以完全错误的方式这样做,所以请告诉我如何通过TCP协议发送“部分”数据。也许根本不需要进行这种拆分?

Har*_*oli 5

字节可能很棘手。

首先,encoded_array = str(int_array).encode()不是按照你的想法去做。如果打印encoded_array,您会看到它实际上将to_stringint_array 的值转换为字节。这就是为什么encoded_array的第一个值是[

>>> encoded_array[:1]
b'['
Run Code Online (Sandbox Code Playgroud)

其次,我不确定你是否想做int_array = [i**2 for i in range(1, 100)]它正在做的事情。它创造的价值高达10,000。如果每个元素代表一个字节,我不确定您是否希望该范围介于 0 到 256 之间。我假设您希望将 一些数据转换为字节并拆分为 40 字节块,并且本例中的数据是整数数组。

首先,我们将 int_array 转换为字节数组。我将把每个 int 转换为 2 字节值并以十六进制表示。

>>> hex_array = [x.to_bytes(2, byteorder="big") for x in int_array]
Run Code Online (Sandbox Code Playgroud)

现在将数据分成 40 个字节

>>> h
[]

>>> for x in range(0, int(round(len(hex_array)/20))):
...     h.append(hex_array[:20])
...     del hex_array[:20]
Run Code Online (Sandbox Code Playgroud)

我将除以 20,因为每个元素包含 2 个字节

现在您将拥有一个最大 40 字节集合的数组。是时候将这些集合合并在一起,以便我们可以传输它们了!

>>> result
[]

>>> for package in h:
...     joined_package = b';'.join(package)
...     result.append(joined_package)
Run Code Online (Sandbox Code Playgroud)