int.to_bytes()の一貫性のない動作

Nov 29 2020

私が書くとき:

expint = 34614  
expint = expint.to_bytes(2,'big')

b '\ x87 \ x36'ではなくexpint = b '\ x876'の値を取得します(3が欠落しており、形式が間違っているようです)。ただし、expint = 65418で同じことを試したところ、正しい結果b '\ xff \ x8a'が得られました。これは、私が使用しているインタプリタまたは他のツールのバグである可能性がありますか?Visual Studio2017でPython3.7を使用しています。

回答

2 KarlKnechtel Nov 29 2020 at 20:32

これはint.to_bytes()、とは何の関係もなく、すべてがbytes型自体と関係があります。

b '\ x87 \ x36'の代わりにexpint = b '\ x876'の値を取得します

b'\x876'b'\x87\x36' は同じものであるため、この苦情は意味がありません。

>>> b'\x87\x36'
b'\x876'
>>> b'\x87\x36' == b'\x876'
True

bytesオブジェクトの表現はありません単に進ダンプ。バイト文字列の文法では、歴史的な理由から、他の多くのオプションを使用できます(つまり、2.xでは、テキストを表すことができるふりをしていたため)。正規表現(つまり、printインスタンスのときにPythonによって生成される表現)は\x、最後の手段としてスタイルエスケープのみを使用します。

ASCIIでは、値を持つバイト0x36はシンボルにマップされます6。(繰り返しますが、以前はこの方法でテキストを表現できるふりをしていました。英語と少数のヨーロッパ言語のみを処理する必要があり、いつでも処理するヨーロッパ言語を選択できる場合は、並べ替えることができます。 -それも避けてください。)