2017-10-18 11 views
0

Ich habe versucht, unten Methoden, aber kein Glück.Nicht in der Lage, HEX ASCII in Python zu konvertieren 3.6.3

Methode 1:

var enthält den Wert hex

bytes.fromhex(var).decode('ascii') 
Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xdb in position 0: ordinal not in range(128) 

Methode 2:

codecs.decode(var,"hex") 

Das bin ich in Bytes zurückkehrt, nicht in ASCII.

Kann jemand bei dieser Konvertierung helfen?

+0

In den Kommentar zu einer der Antworten haben Sie den tatsächlichen Wert von 'var' eingefügt. Diese hexadezimale Zeichenfolge kann nicht ASCII-codiert sein, da sie Hexadezimalwerte außerhalb des ASCII-Bereichs enthält. Die Fehlermeldung ist gültig. – ElmoVanKielmo

+0

aber mit Python 2.7.3 kann ich es mit dieser Methode konvertieren (var.decode ("hex")) – CoolNetworking

+0

mit python 2.7.3 das ist das Ergebnis >>> var = var.decode ('hex') >>> type (var) Ich kann die Var-Ausgabe nicht als zu lange einfügen, aber es funktioniert. – CoolNetworking

Antwort

1

Haben Sie versucht:

chr(var) 

Dies sollten Sie die Zeichen für einen ASCII-Code geben.

+0

arbeiten, wie wird das helfen, wie Var Hex-Wert enthält ? Das ist mein hex value.'DB91132598CCBF76AE668B4B085176BB192775221FDBB50FCE1C3927C077EAF1E3DAC4C8A8E8028C3F7295EF8157CED597A36EF1C3BFA451477BFF32EEB1806C2CC0442585197A2BCD2C4392147AADB93066D0BA5AB6DBFD3F6FCEB7073AE61A5D4AA8ABCBCFF4EEBD1A1655689BFD7EAB82D77BF7224F75FBCD323C9B9FA9C0B7D799180878A81D5D07CF05BE39EEF989B2FC3077997D2C2F1162E5B47D99E4B415BC8CE5C755476931BD8ED14B5FCEC1C8C654515946AB7860BBBEE7DCCFDAA7AA410FF65352B153B58728D57814C610F825286D830C308429BDCF1167887B125EFB2FA34B3DEACD329F57674C071BEF6C9CEAC0C7FABB587A1D6F8B4D0B53' – CoolNetworking

+0

In diesem Fall var ein String mit einem Hex-codierten Wert ist? Sie könnten versuchen, ganzzahlige Werte mit int (var, 16) zu erhalten, aber Sie müssen var in Tupel von zwei Zeichen aufteilen. diese –

+0

ist, was var enthält ‚DB91132598CCBF76AE668B4B085176BB192775221FDBB50FCE1C3 927C077EAF1E3DAC4C8A 8E8028C3F7295EF8157C ED597A36EF1C3BFA4514 77BFF32EEB1806C2CC04 42585197A2BCD2C43921 47AADB93066D0BA5AB6D BFD3F6FCEB7073AE61A5 D4AA8ABCBCFF4EEBD1A1 655689BFD7EAB82D77BF 7224F75FBCD323C9B9FA 9C0B7D799180878A81D5 D07CF05BE39EEF989B2F C3077997D2C2F1162E5B 47D99E4B415BC8CE5C75 5476931BD8ED14B5FCEC 1C8C654515946AB7860B BBEE7DCCFDAA7AA410FF 65352B153B58728D5781 4C610F825286D830C308 429BDCF1167887B125EF B2FA34B3DEACD329F576 74C071BEF6C9CEAC0C7F ABB587A1D6F8B4D0B53 ' – CoolNetworking

0
>>> var = int('7A', 16) #var is an integer now 
>>> chr(var) #int value to char 
'z' 

Diese Lösung ist nur für ein Zeichen. Sie müssen die Zeichenfolge teilen und alle Hex-Werte getrennt konvertieren. Schauen Sie sich here an, wie Sie es teilen.

+0

meine Var enthält eine Zeichenfolge von Hex-Wert.wie wird das helfen? – CoolNetworking

+0

Sehen Sie sich meine Edit – raze92

+0

CHR (0xf8) ist kein ASCII-Zeichen seit 0xf8 == 248 und das ist über 128. Tatsächlich ist dieses Zeichen: 'import unicodededata' =>' print (unicodedata.name (chr (0xf8))) '=>' LATEIN KLEINER BUCHSTABE O MIT SCHLAG' – MaximTitarenko

0

haben Sie

codecs.decode(codecs.decode(var,'hex'),'ascii') 
+0

ja, aber es gibt mir unten Fehler >>> codecs.decode (codecs.decode (var, 'hex'), 'ascii') Traceback (letzten Anruf zuletzt): Datei "", Zeile 1, in UnicodeDecodeError: 'Ascii' Codec kann Byte 0xdb in Position 0 nicht dekodieren: Ordnungszahl nicht im Bereich (128) – CoolNetworking

+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genügend [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https: // stackoverflow.com/help/privileges/Kommentar); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/17662238) – lit

1

versucht Wie aus der Frage folgt ich mit Python 3x annehmen.

Der Grund Ihres Fehler ist die Tatsache, dass Sie versuchen, mit ASCII das Byte '0xdb' zu dekodieren, die den Wert über 127.
haben Sie können einfach nicht tun - es ist so ein Byte-Wert in ASCII-Kodierung nicht.

Optionen sind verfügbar:

1. decode Fehler ignorieren:

>>> u = 'DB91132598CC' # unicode 
>>> b = codecs.decode(u,"hex") # bytes 
>>> b 
b'\xdb\x91\x13%\x98\xcc' 
>>> result = b.decode("ascii", errors="ignore") # unicode 
>>> result 
'\x13%' 

2. Verwenden Sie unterschiedliche Codierung:

>>> result = b.decode("cp1252") # for example 
>>> result 
'Û‘\x13%˜Ì' 

Wenn Sie nur ASCII-Zeichen im Ergebnis Verwendung Option # 1 wollen.

0

der folgende Code:

codecs.decode(var,"hex") 

in Python 2.7 Ergebnisse mit str:

'\xdb\x91\x13%\x98\xcc\xbfv\xaef\x8bK\x08Qv\xbb\x19\'u"\x1f\xdb\xb5\x0f\xce\x1c9\'\xc0w\xea\xf1\xe3\xda\xc4\xc8\xa8\xe8\x02\x8c?r\x95\xef\x81W\xce\xd5\x97\xa3n\xf1\xc3\xbf\xa4QG{\xff2\xee\xb1\x80l,\xc0D%\x85\x19z+\xcd,C\x92\x14z\xad\xb90f\xd0\xbaZ\xb6\xdb\xfd?o\xce\xb7\x07:\xe6\x1a]J\xa8\xab\xcb\xcf\xf4\xee\xbd\x1a\x16Uh\x9b\xfd~\xab\x82\xd7{\xf7"Ou\xfb\xcd2<\x9b\x9f\xa9\xc0\xb7\xd7\x99\x18\x08x\xa8\x1d]\x07\xcf\x05\xbe9\xee\xf9\x89\xb2\xfc0w\x99},/\x11b\xe5\xb4}\x99\xe4\xb4\x15\xbc\x8c\xe5\xc7UGi1\xbd\x8e\xd1K_\xce\xc1\xc8\xc6TQYF\xabx`\xbb\xbe\xe7\xdc\xcf\xda\xa7\xaaA\x0f\xf6SR\xb1S\xb5\x87(\xd5x\x14\xc6\x10\xf8%(m\x83\x0c0\x84)\xbd\xcf\x11g\x88{\x12^\xfb/\xa3K=\xea\xcd2\x9fWgL\x07\x1b\xefl\x9c\xea\xc0\xc7\xfa\xbbXz\x1do\x8bM\x0bS' 

und in Python 3.6 bytes:

b'\xdb\x91\x13%\x98\xcc\xbfv\xaef\x8bK\x08Qv\xbb\x19\'u"\x1f\xdb\xb5\x0f\xce\x1c9\'\xc0w\xea\xf1\xe3\xda\xc4\xc8\xa8\xe8\x02\x8c?r\x95\xef\x81W\xce\xd5\x97\xa3n\xf1\xc3\xbf\xa4QG{\xff2\xee\xb1\x80l,\xc0D%\x85\x19z+\xcd,C\x92\x14z\xad\xb90f\xd0\xbaZ\xb6\xdb\xfd?o\xce\xb7\x07:\xe6\x1a]J\xa8\xab\xcb\xcf\xf4\xee\xbd\x1a\x16Uh\x9b\xfd~\xab\x82\xd7{\xf7"Ou\xfb\xcd2<\x9b\x9f\xa9\xc0\xb7\xd7\x99\x18\x08x\xa8\x1d]\x07\xcf\x05\xbe9\xee\xf9\x89\xb2\xfc0w\x99},/\x11b\xe5\xb4}\x99\xe4\xb4\x15\xbc\x8c\xe5\xc7UGi1\xbd\x8e\xd1K_\xce\xc1\xc8\xc6TQYF\xabx`\xbb\xbe\xe7\xdc\xcf\xda\xa7\xaaA\x0f\xf6SR\xb1S\xb5\x87(\xd5x\x14\xc6\x10\xf8%(m\x83\x0c0\x84)\xbd\xcf\x11g\x88{\x12^\xfb/\xa3K=\xea\xcd2\x9fWgL\x07\x1b\xefl\x9c\xea\xc0\xc7\xfa\xbbXz\x1do\x8bM\x0bS' 

Der Grund hierfür ist, dass in Python 2.7

str == bytes #True 

während in Python 3,6

str == bytes #False 

Python 2 Strings sind Byte-Strings, während Python 3 Strings Unicode-Strings sind.Beide Ergebnisse sind tatsächlich identisch, aber die Bytezeichenfolge in Python 3 ist vom Typ bytes nicht str und die Literal-Darstellung hat das Präfix b.
Dies hat nichts mit der ASCII-Codierung zu tun, da keine der Ausgabevariablen (unabhängig von der Python-Version) ASCII-codiert ist.
Außerdem auf Python 2.7 erhalten Sie auch diese Fehlermeldung erhalten:

codecs.decode(var, 'hex').decode('ascii') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xdb in position 0: ordinal not in range(128) 

Ich klebte es tatsächlich aus Python 2.7 Interpreter aber Sie können selbst überprüfen.
Ihre Ausgabe-Zeichenfolge kann nicht mit ascii Codec in einer beliebigen Version von Python decodiert werden, da es einfach nicht ascii codierte Zeichenfolge in jedem Fall ist.

+0

Danke für Ihre Antwort. Eigentlich möchte ich ein Äquivalent dieser Decodiermethode (var.decode ("hex")) in 3.6 Version, die in Ordnung ist 2.7 und gibt mir das erwartete Ergebnis. – CoolNetworking

+0

@CoolNetworking das Ergebnis ist das gleiche. Bytestring. Nur die Notation ist anders, da Python 3 eine Unicode-Zeichenkette als 'str'-Typ hat. – ElmoVanKielmo

Verwandte Themen