2016-04-09 6 views
0

Ich habe eine sehr grundlegende Frage über das Ausgabeformat von os.urandom in Python2 und Byte-Darstellung allgemeiner. Ein Byte 8 Bits, so beispielsweise in binären ein bestimmtes einzelnen Byte wäre:os.urandom und Byte-Darstellung

10011001 

os.urandom(n) gibt eine Zufall n-Byte-String für kryptographische Verwendung. Wenn ich ein paar Anrufe zu os.urandom(1) ausdrucken, nur ein einziges Byte zu erzeugen, finde ich Dinge wie:

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

So scheint es, dass urandom() ein Byte repräsentiert nicht als 8 Bit, sondern als 2-stellige Hex-Zahlen (beide macht natürlich Sinn weil 2^8 = 16^2). Meine Verwirrung ist, dass nur einige der oben genannten 2-stellige Hex-Zahlen sind, gibt es auch Zeichen wie "S" oder "?" oder '['. Was ist das Ausgabeformat? Wie lautet die Regel für das Konvertieren einer Ausgabe wie '[' in binär?

Antwort

4

Es ist wirklich nichts mit os.urandom - es ist nur, wie repr() auf alle Saiten wirkt. Wie so:

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

Im Allgemeinen, wenn ein Byte zu einem druckbaren ASCII-Zeichen entspricht, zeigt repr das Zeichen, sonst eine hex \x Flucht produziert wird.

Um die Bytes in Python 2 klar zu sehen, folgen Sie dem obigen Muster, durchlaufen die Zeichen/Bytes und verwenden ord(), um ihre Dezimalwerte anzuzeigen.

+0

Ah, ich sehe jetzt. Die ASCII-Tabelle erstreckt sich auf 127, und so werden die Bits 0 bis 127 über ihre ASCII-Darstellung angezeigt und die restlichen Bits werden in Hex ausgegeben. Vielen Dank! –

+0

Es ist kniffliger als nur das, aber ya, das ist die Grundidee. Zum Beispiel sind die Bytes 0 bis 31 nicht "druckbar", also erscheinen sie auch als hex-Escape. –