2016-12-28 4 views
-1

私はpythonでstruct libraryを使っています。私は構造体ライブラリのpack関数を使用している間、珍しいものを見つけました。 ubuntuでテストされています。 ASCIIテーブルを調べたところ、TABと改行のASCII値はそれぞれ9と10でした。しかし、なぜ他の値の場合、そのような同等の文字は表示されませんか?なぜpythonのstruct.pack( "B"、9)とstruct.pack( "B"、10)は出力として ' t'と ' n'を生成しますか?

import struct 
struct.pack("B",0) 
'\x00' 

struct.pack("B",8) 
'\x08' 

struct.pack("B",9) 
'\t' # why ???  

struct.pack("B",10) 
'\n' # why ???? 

struct pack("B",11) 
'\x0b' 

答えて

1

は、この構造体のモジュールとは全く関係ありません:それは、文字列オブジェクトのrepr()が印刷できない文字を表示することを選択し、単に方法です。

>>> [chr(i) for i in range(8,12)] 
['\x08', '\t', '\n', '\x0b'] 

すべての制御文字は名前を持っていますが、そのほとんどは歴史的な興味があります。一貫した意味を持つほんの少数だけが、Python(そして他のほとんどの言語)での1文字のバックスラッシュエスケープシーケンスを持っています。便宜上、Pythonは汎用の16進エスケープではなく、文字列を表示するときにこれらのエスケープシーケンスを使用します。それは文字列に変換されたときに

1

0、8のための同等の文字がないので、および11それは問題であるsruct.packない

が、それはビットパターンの表現です。対話セッションでstruct.pack("B",10)と入力すると、Pythonは文字列に変換する必要があり、その場合は__repr__()を使用します。 printは、他の一方で、__str__()使用して、異なる結果を与える可能性があります

試してみてください。

print struct.pack("B",10) 

あなたが表示された空白行を取得します。オブジェクトを表示すると値のテキスト表現のみが表示されます。

関連する問題