0

我正在尝试使用 struct 模块中的 pack 函数将数据编码为网络协议所需的格式。我遇到了一个问题,因为我没有看到任何方法来编码除 8 位字符之外的任何数组。

例如,要编码“TEST”,我可以使用格式说明符“4s”。但是如何对 32 位整数或其他非字符串类型的数组或列表进行编码?

这是一个具体的例子。假设我有一个doEncode接受 32 位值数组的函数。该协议需要一个 32 位长度的字段,然后是数组本身。这是我到目前为止所能想到的。

from array import *
from struct import *

def doEncode(arr):
    bin=pack('>i'+len(arr)*'I',len(arr), ???)

arr=array('I',[1,2,3])
doEncode(arr)

我能想到的最好的方法是根据数组的长度动态地为包字符串生成格式。是否有某种方法可以指定我有一个数组,所以我不需要这样做,就像有一个字符串(例如会是pack('>i'+len(arr)+'s')?

即使使用上述方法,我也不确定如何以类似的动态方式实际传递数组中的元素,即我不能只说, arr[0], arr[1], ...,因为我提前不知道长度是多少.

我想我可以将数组中的每个整数打包成一个循环,然后将所有结果连接在一起,但这似乎是一个 hack。有没有更好的方法来做到这一点?array 和 struct 模块似乎都在做自己的事情,但在这种情况下,我想要做的是两者的结合,两者都不想做。

4

1 回答 1

1
data = pack('>i', len(arr)) + arr.tostring()
于 2013-01-14T16:05:05.783 回答