1

次のステートメントの結果を理解できません。

>>> from array import array
>>> array('L',[0xff,0xff,0xff,0xff])
array('L', [255L, 255L, 255L, 255L])


>>> from array import array
>>> array('L','\xff\xff\xff\xff')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: string length not a multiple of item size
4

2 に答える 2

3

型コードを 64 ビット符号なし整数としてarray扱うPython の 64 ビット ビルドでこれを実行しています。'L'

>>> array('L','\xff\xff\xff\xff\xff\xff\xff\xff')
array('L', [18446744073709551615L])

ドキュメントはあまり明確ではありません。それが言うのは、それ'L'が少なくとも4バイトであるということだけです。

于 2010-05-02T09:05:38.107 に答える
1

最初のケースでは、4 つの要素を持つリストから配列を初期化しています。これにより、リスト内の各値に 1 つずつ、合計 4 つの要素を持つ配列が得られます。

2 番目のケースでは、バイト文字列から配列を初期化しています。文字列内のバイトは配列に直接コピーされます。'L' 指定子は、最小サイズが 4 バイトの unsigned long の配列を作成します。

私のマシン (Windows 64 ビット Python 2.6) では、4 バイト文字列からの初期化は正常に機能します。

>>> a = array('L','\xff\xff\xff\xff')

>>> a.tostring()
'\xff\xff\xff\xff'

使用している Python のバージョンに関係なく、4 バイトではなく 8 バイトの unsigned long があると思います。リストから作成した配列を文字列に変換し、含まれるバイト数を確認してください。

>>> a = array('L',[0xff,0xff,0xff,0xff])
>>> a.tostring()
'\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00'

PS Python 2.x を使用していると仮定していますが、Python 3.x では代わりに TypeError が返されます。

于 2010-05-02T09:07:59.147 に答える