1

私はPython2.7.3でbytearrayタイプをいじっていて、この奇妙な振る舞いに気づきました。

コンストラクターに整数引数を渡すと、ゼロバイトで埋められた整数に等しいサイズのバイト配列が作成されます。

>>> s = bytearray(15)
>>> s
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

ただし、自分で手動で設定したバイトを使用してバイト配列を作成しようとすると、コンストラクターは作成したバイトの一部を無視/スキップするように見えます

>>> s = bytearray(b'\x34\x78\x98\xFF\xFF')
>>> s
bytearray(b'4x\x98\xff\xff')

なぜこうなった?これはバグですか?それとも私は何かが足りないのですか? Pythonのドキュメントはあまり啓蒙的ではありません

4

2 に答える 2

10

奇妙なことは何も起こっていません、すべてのバイトはまだそこにあります。リラックス!:)

混乱は、表現がわずかに最適化されているという事実から生じています。値が印刷可能な文字を表すバイトは、それらの文字として印刷されます。これにより、出力では4文字ではなく1文字だけが使用されます。

それはそれが言うことをしている:

  • \x34は文字です。これが、バッファが' '4で始まる理由です。4
  • \x78は文字ですx。そのため、' x'の後に' 4'があります。
  • \x98\xff\xffすべて現状のままです。

5を出力することに注意してくださいlen(s)

壮大なグラフィック表現:

    +---+---+------+------+------+
s = | 4 | x | \x98 | \xff | \xff |
    +---+---+------+------+------+
于 2012-11-06T12:34:13.657 に答える
1

ドキュメントで想定されているとおりに実行します。

整数の場合、配列はそのサイズになり、nullバイトで初期化されます。

あなたがそれに15を与えたとき、それはまさにそれがしたことです。そこには何も奇妙なことはありません。

文字列の場合は、エンコーディング(およびオプションでエラー)パラメータも指定する必要があります。次に、bytearray()は、str.encode()を使用して文字列をバイトに変換します。

あなたがそれにあなたのひもを与えたとき。デフォルトをもたらすエンコーディングまたはエラーパラメータを指定しませんでした。デフォルトではに\x34なり4、に\x78なりxます。\x98また\xFF、ASCIIでの表現がないため、バイトとして残ります。

于 2012-11-06T12:37:24.230 に答える