0

struct モジュールで pack 関数を使用して、データをネットワーク プロトコルで必要な形式にエンコードしようとしています。8 ビット文字以外の配列をエンコードする方法が見つからないという問題に遭遇しました。

たとえば、「TEST」をエンコードするには、フォーマット指定子「4s」を使用できます。しかし、32 ビット整数またはその他の非文字列型の配列またはリストをエンコードするにはどうすればよいでしょうか?

これが具体的な例です。doEncode32 ビット値の配列を取る関数があるとします。プロトコルには、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], ...上記のアプローチでも、配列内の要素を同様の動的な方法で実際に渡す方法がわかりません。つまり、長さがどのくらいになるかを事前に知らないため、単に言うことはできません.

配列内の個々の整数をループでパックし、すべての結果を結合することができると思いますが、これはハックのようです。これを行うためのより良い方法はありますか?配列モジュールと構造体モジュールはそれぞれ独自のことをしているように見えますが、この場合、私がやろうとしているのは両方の組み合わせであり、どちらもやりたくないことです。

4

1 に答える 1

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