2016-04-09 7 views
0

私は、python2での出力フォーマットos.urandomと、より一般的なバイト表現について非常に基本的な質問があります。バイナリで、例えば特定の単一バイトであろうように、バイトは、8ビットである:os.urandomとバイト表現

10011001 

os.urandom(n)は、暗号化の使用に適したランダムのnバイトの文字列を返します。私はちょうど1バイトを生成os.urandom(1)に一握りの呼び出しを、プリントアウトした場合、私のようなものを見つける:

'\x1f', '\xa0', '#', '\xa4', "'", '\xa8', '+', '\xac', '/', '\xb0', '3', '\xb4', '7', '\xb8', ';', '\xbc', '?', '\xc0', 'C', '\xc4', 'G', '\xc8', 'K', '\xcc', 'O', '\xd0', 'S', '\xd4', 'W', '\xd8', '[' 

は、だから、urandom()がない8ビットとしてではなく、2桁の16進数としてバイトを(両方とも代表されるようですもちろん2^8 = 16^2なので)。私の混乱は、上記のうちのいくつかだけが2桁の16進数で、「S」や「?」のような文字もあるということです。または '['。出力フォーマットとは何ですか? '[']のような出力をバイナリに変換するルールは何ですか?

答えて

4

実際にはos.urandomとは何の関係もありません。それはちょうどrepr()がすべての文字列に作用する方法です。これと同じように:バイトは印刷可能なASCII文字に対応する場合、一般的に

>>> for ch in "\x1f\xa0#+\x01": 
...  print("%6s %3d" % (repr(ch), ord(ch))) 
'\x1f' 31 
'\xa0' 160 
    '#' 35 
    '+' 43 
'\x01' 1 

reprはその文字、それ以外の六角\xエスケープが生成さを示しています。

Python 2でバイトをはっきりと確認するには、上のパターンに従って文字/バイトを繰り返し、ord()を使用して小数点を表示します。

+0

ああ、わかりました。 ASCIIテーブルは127に拡張されているので、0から127の番号を付けたビットはASCII表現で表示され、残りのビットは16進数で表示されます。どうもありがとう! –

+0

それはちょっと難しいですが、それは基本的な考えです。たとえば、バイト0〜31は「印刷可能」ではないため、16進エスケープとしても表示されます。 –