Seltsame Ausgabe unter Python 3.3.2

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
may24x
User
Beiträge: 48
Registriert: Montag 2. September 2013, 06:44

Hi zusammen, um eine simple OTP Verschlüsselung zu demonstrieren habe ich ein kurzes Beispiel zusammengehackt.
Syntaktisch passt alles. Und es kommt auch das raus was rauskommen soll. Nur warum ist der Output von Zeile 3 so komisch ? Bug ?

Hier mein Code:

Code: Alles auswählen

plain = bytearray([0xA0,0x01,0x02,0x03,0x04])
print("Plain:	", plain)

otp1 = bytes([0x11,0xA7,0x93,0xFF,0xB0])
otp2 = bytes([0xAF,0xCE,0x73,0x01,0x6C])

cypr1 = bytearray(5)
cypr2 = bytearray(5)
cypr3 = bytearray(5)

for x in range(0,5):
	xored = plain[x] ^ otp1[x]
	cypr1[x] = xored

print("Cypr1:	", cypr1)

for x in range(0,5):
	xored = cypr1[x] ^ otp2[x]
	cypr2[x] = xored

print("Cypr2:	", cypr2)

for x in range(0,5):
	xored = cypr2[x] ^ otp1[x]
	cypr3[x] = xored
for x in range(0,5):
	xored = cypr3[x] ^ otp2[x]
	cypr3[x] = xored

print("Final:	", cypr3)
Und hier der output:

Code: Alles auswählen

Plain:	 bytearray(b'\xa0\x01\x02\x03\x04')
Cypr1:	 bytearray(b'\xb1\xa6\x91\xfc\xb4')
Cypr2:	 bytearray(b'\x1eh\xe2\xfd\xd8')
Final:	 bytearray(b'\xa0\x01\x02\x03\x04')
>>> 
BlackJack

@may24x: Also für mich sieht alles so aus wie es sollte. Also zumindest was die von Python erwartbare Ausgabe aussieht. Als Benutzer hätte ich vielleicht eher zeistellige Hexadezimalwerte durch Leerzeichen getrennt erwartet und nicht die `repr()`-Form von `bytearray`-Objekten.

Ich nehme mal an Du hast aus irgendwelchen Gründen nicht damit gerechnet, dass nicht jeder Bytewert nach dem Muster '\x??' ausgegeben wird. Druckbare Zeichen und einige Steuerzeichen werden anders ausgegeben. Das soll so, damit man die einfacher erkennen kann. Diese Ausgabe ist aber auch nicht für Endnutzer gedacht, sondern mehr für den Programmierer zur Fehlersuche.
may24x
User
Beiträge: 48
Registriert: Montag 2. September 2013, 06:44

errw ... ein bytearray sollte doch ein Array aus bytes darstellen ... oder ?
D.h. jede "zelle" kann einen Wert von x00 bis xFF haben. Wie kommt's dann das auf einmal x1eh (?!?) steht ? Oder hab' ich da was falsch verstanden ? Und was ist das "h" überhaupt ?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

may24x hat geschrieben:Und was ist das "h" überhaupt ?

Code: Alles auswählen

>>> ord('h')
104
>>> hex(104)
'0x68'
>>> bytes([0x1e, 0x68, 0xe2, 0xfd, 0xd8])
b'\x1eh\xe2\xfd\xd8'
Das ist der hexadezimale Wert 68 der als ASCII-Character ausgegeben wird.

Code: Alles auswählen

>>> bytes([0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e])
b'Python'
may24x
User
Beiträge: 48
Registriert: Montag 2. September 2013, 06:44

aaah, verstehe. Und warum wird der nicht - wie der Rest - als x68 ausgegeben ?
Der Rest wird doch auch als Hex Wert ausgegeben. Warum auf einmal 'ne Konvertierung auf ASCII ?
BlackJack

@may24x: Wie schon gesagt, das ist zur Fehlersuche für Programmierer gedacht und die meisten können 'Python' leichter lesen als '\x50\x79\x74\x68\x6f\x6e'. Die Escape-Sequenzen sind ja auch nicht der Normalfall sondern der Ausnahmefall. Die Frage ist nicht warum 'h' nicht als '\x68' ausgegeben wird, sondern warum Zeichen ausserhalb von ASCII als Escape-Sequenzen ausgegeben werden. Weil die nicht eindeutig als Zeichen ausgegeben werden können.
may24x
User
Beiträge: 48
Registriert: Montag 2. September 2013, 06:44

Hm, na wenn ich das so lese wird's erst mal keine andere Möglichkeit geben ... oder wie könnte ich den Output so "formatieren" das ich die Werte nur in Hex angezeigt bekomme? Also etwa so: x11, xA0, xFF ...
BlackJack

@may24x: In dem Du das selber machst und nicht auf eine `repr()`-Darstellung baust. Die Ausgabe wäre ja auch ohne dieses „Problem” nicht wirklich schön. Es gibt Zeichenkettenformatierung und da auch die Möglichkeit Zahlenwerte als Hexadezimalwerte darstellen zu lassen. Schau Dir mal die `format()`-Methode an und was man da alles als Formatspezifizierer verwenden kann.
Antworten