【问题标题】:Divide 'bytes' object into chunks in Python在 Python 中将“字节”对象划分为块
【发布时间】:2018-07-18 09:41:07
【问题描述】:

我需要使用 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),在这种特殊情况下等于 551 个字节。

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

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

【问题讨论】:

  • “sockets”还是“socket”模块?
  • structmodule 对这个有用吗?
  • @MustacheMoses 是的,感谢您的注意,它是“套接字”
  • "sys.getsizeof" 不检查字节的长度,它检查字节对象的大小。如果你想要长度,你需要len(byte_object)
  • @juanpa.arrivillaga 你是对的,我在描述中做了修正

标签: python python-3.x sockets tcp


【解决方案1】:

字节可能很棘手。

首先,encoded_array = str(int_array).encode() 没有按照您的想法行事。如果您打印encoded_array,您会看到它实际上是将int_array 的to_string 值转换为字节。这就是为什么coded_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)

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 2021-06-17
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多