2017-04-30 2 views
0

Ich habe einige rohen Zeichenfolge, die ichWie Python rohe Zeichenfolge in Hex konvertiert?

>>> word_str = "4954640000005200000005a7a90fb36ecd3fa2ca7ec48ca36004acef63f77157ab2f53e3f768ecd9e18547b8c22e21d01bfb6b3de325a27b8fb3acef63f77157ab2f53e3f768ecd9e185b7330fb7c95782fc3d67e7c3a66728dad8b59848c7670c94b29b54d2379e2e7a" 

>>> hex_str = word_str.decode('hex') 
>>> hex_str = "ITd\x00\x00\x00R\x00\x00\x00\x05\xa7\xa9\x0f\xb3n\xcd?\xa2\xca~\xc4\x8c\xa3`\x04\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85G\xb8\xc2.!\xd0\x1b\xfbk=\xe3%\xa2{\x8f\xb3\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85\xb73\x0f\xb7\xc9W\x82\xfc=g\xe7\xc3\xa6g(\xda\xd8\xb5\x98H\xc7g\x0c\x94\xb2\x9bT\xd27\x9e.z" 

Mit Blick auf ascii Tabelle zu einem Zeitpunkt, nehme ich an, dass es dauert zwei Zahlen verhexen bin Umwandlung und wandelt sie durch entsprechenden Wert aus ASCII-Tabelle wie

49 -> I 
54 -> T 
64 -> d 
00 -> \x00 
00 -> \x00 

Aber irgendwann diese Regel bricht

52 -> \x00R (00 and 52) 

wird dann schreitet zu einer Zeit, zwei Zahlen zu nehmen und

00 -> \x00 
00 -> \x00 
00 -> \x00 
05 -> \x05 
a7 -> \xa7 
a9 -> \xa9 
0f -> \x0f 

Hier dauert es 2 Paare (b3 und 63) zur gleichen Zeit, anstatt von einem, in der es nicht mit b3 geeignetem Wert konvertiert (von erweiterten ASCII-Tabelle)

b36e -> \xb3n 

Hier cd \xcd? wird ...

cd -> \xcd? 

Mein Ziel ist es, das gleiche (variable.decode ('hex')) in C++ zu implementieren, aber ich brauche, um zu verstehen, was g Welche Algorithmus wurde hier verwendet?

Antwort

0

Worum Sie bitten, ist die Darstellung der Zeichenfolge für das Drucken in einem für Menschen lesbaren Format. Die Zeichenfolge selbst enthält die Werte jedes Bytes in der ursprünglichen Hex-Zeichenfolge (wobei jedes Byte von zwei ursprünglichen Ziffern abgeleitet wird).

Einige der Bytes in Ihrer Zeichenfolge sind Zeichen, die nicht druckbar sind oder in ASCII nicht dargestellt werden können. Für diese verwendet Python einen Escape-Code: \x, gefolgt von den zwei ursprünglichen Hex-Ziffern.

In Ihrem Beispiel b36e -> \xb3n konvertiert Python die b3-\xb3. Das nächste Byte, 6e, ist ASCII für den Kleinbuchstaben n und da es druckbar ist, kommt es wörtlich. Python ist nicht "zwei auf einmal nehmen"; Jedes Byte wird separat verarbeitet.

Also im Grunde, wenn Sie "das gleiche tun" in C++ wollen, dann möchten Sie alle Zeichen zwischen 32 und 126 (inklusive) wortwörtlich hinzufügen, und alles außerhalb dieses Bereichs mit der \x escape.

Ich bin mir nicht sicher, ob Sie wirklich dasselbe in C++ machen wollen; vielleicht können Sie erklären, warum Sie eine Python-String-Darstellung in C++ generieren möchten.

+0

Ich habe etwas Code (Socket-Client, der mit Server-Gerät kommuniziert), aber es funktioniert ziemlich langsam, aus Leistungsgründen sollte es in C++ geschrieben werden. –

+0

Ich wette, es sendet buchstäblich nur die Bytes. Ich kann mir nicht vorstellen, warum es den Zeichen im Python-Stil entkommen würde, um sie an einen Server zu senden. – kindall

+0

Danke Mann für diese geniale Antwort. Juts jetzt habe ich es mit wireshark überprüft und das ist es genau. –

Verwandte Themen