拆分Python'字节'对象按字节数

时间:2018-02-07 23:23:08

标签: python python-3.x sockets tcp

我需要通过'软件包发送数组'使用TCP Protocol和Python的socket模块的特定长度(例如40个字节)。 首先,我生成ints的样本数组:

int_array = [i**2 for i in range(1, 100)]

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

encoded_array = str(int_array).encode()

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

说,我想发送40个字节长的包:这使得13个包长40个字节,剩下的是bytes的最后一个字节,总共14个包。但我无法弄清楚如何将bytes个对象划分为较小的TCP个对象本身的字节数。任何人都知道如何做到这一点?

我也知道我可能会以完全错误的方式这样做,所以请告诉我如何发送'分配'数据通过unsigned long协议,可能根本不需要进行此拆分。

1 个答案:

答案 0 :(得分:0)

字节可能很棘手。

首先,encoded_array = str(int_array).encode()并没有按照您的想法做。如果打印encode_array,您会发现它实际上是将int_array的to_string值转换为字节。这就是为什么encode_array的第一个值为[

的原因
>>> encoded_array[:1]
b'['

第二,我不确定您是否要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]

现在将数据分成40个字节

>>> h
[]

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

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

现在,您将有一个最多40个字节的集合数组。是时候将这些收藏加入到一起,让我们可以传播它们了!

>>> result
[]

>>> for package in h:
...     joined_package = b';'.join(package)
...     result.append(joined_package)