我正在尝试使用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], ...
,因为我不知道提前知道长度是多少。
我想我可以在循环中打包数组中的每个单独的整数,然后将所有结果连接在一起,但这看起来像是一个黑客。有没有更好的方法来做到这一点?数组和结构模块每个似乎都做了自己的事情,但在这种情况下,我想要做的是两者的结合,这两者都不想做。
答案 0 :(得分:1)
data = pack('>i', len(arr)) + arr.tostring()