Wie konvertiert einen string von hex-Werte in einen string?
Sagen, ich habe einen string wie:
string hex = "48656c6c6f";
Denen jede zwei Zeichen entsprechen dem hex-Darstellung Ihrer ASCII-Wert, zB:
0x48 0x65 0x6c 0x6c 0x6f = "Hello"
So, wie bekomme ich "hello"
aus "48656c6c6f"
zimmerreserviereung, ohne das Sie erstellen eine ASCII lookup-Tabelle? atoi()
offensichtlich funktioniert hier nicht.
Verwandte, finden Sie unter Konvertieren von hexadezimal-string mit führendem "0x" signed short in C++?
InformationsquelleAutor NullUserException | 2010-09-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Speicherung einer Länge in einer
int
. Nun, warum sollte man das tun?Wenn ich nicht, es nennen würde, string::length() jedes mal durch die Schleife. Da ich weiß, es wird gleich bleiben, keine Notwendigkeit zu gehen durch die zusätzliche Arbeit. (Es sei denn, Sie sind zu hinterfragen, meine Wahl von int über sagen lange -- weil ich nicht sehen konnte dies praktisch an einer Schnur, die länger als das, was würde passen in einen int length)
Ist
string::length()
O(1)?Ich Stimme mit sbi: size_t verwenden. Ihre IDE - /compiler-Flagge sollte dies als Warnung sowieso.
InformationsquelleAutor James Curran
Hex-Ziffern sind sehr einfach zu konvertieren, um binäre:
Damit zu tun, der ganze string sieht wie folgt aus:
Man könnte vernünftigerweise Fragen, warum würde man es so machen, wenn es
strtol
, und es wird wesentlich weniger code (wie bei James Curran ' s Antwort). Naja, der Ansatz ist eine vollständige dezimal Größenordnung langsamer, da es Kopien von zwei-byte-chunk (möglicherweise allokierung von heap-Speicher zum tun) und dann ruft eine Allgemeine text-in-Zahl-Konvertierung-routine, die nicht geschrieben werden können, so effizient wie die spezialisierte code oben. Christians Ansatz (mit istringstream) wird fünf mal langsamer als , dass. Hier ist ein benchmark-plot - Sie können den Unterschied sogar mit einem kleinen block von Daten zu Dekodieren, und es wird zu krass, wie die Unterschiede größer werden. (Beachten Sie, dass beide Achsen sind auf einer log-Skala.)Ist diese vorzeitige Optimierung? Hölle keine. Dies ist die Art von operation, schob ruft in einer library routine, vergessen, und rief dann Tausende mal pro Sekunde. Es muss Schreien. Ich arbeitete an einem Projekt ein paar Jahre zurück, die sehr starke Nutzung von SHA1-Prüfsummen intern -- wir haben 10-20% SpeedUp auf gemeinsame Operationen speichert Sie als raw-bytes anstelle von hex konvertieren nur, wenn wir Ihnen zeigen, um den Benutzer-und das war mit Konvertierungsfunktionen, die bereits abgestimmt worden, um den Tod. Man könnte ehrlich gesagt lieber in der Kürze der Leistung hier, je nachdem, was die größere Aufgabe ist, aber wenn das so ist, warum auf der Erde Sie Programmierung in C++?
Auch aus Pädagogischer Sicht, ich denke, es ist nützlich, um zu zeigen, hand-codiert Beispiele für diese Art von problem; es verrät mehr über das, was der computer zu tun hat.
Ich ignorierte Sie, weil Sie zehnmal langsamer, als Sie es von hand. Sehen Sie auf Bearbeiten.
+1 für die Fokussierung auf die Leistung, denn das ist wahrscheinlich etwas, das Häufig verwendet wird, wie in einer performance-kritischen Schleife. Auch für die Realisierung ist es nicht das "richtige" lehrbuch Antwort, und empfehle es versteckt hinter einer library-Funktion. Das ist der beste Ort für die hässlichen code wie dieser: hinter einer schönen Oberfläche.
+1 für die benchmark; obwohl ich glaube, James und Christian Implementierungen sind in Ordnung, für, wohin ich gehe.
+1 Bibliothek Einrichtungen sind nicht immer vorhanden!!!
InformationsquelleAutor zwol
Kann ich nicht kommentieren, aber zwol, der die Lösung hat einen bug:
ist richtig
als shift-operator hat einen niedrigeren Vorrang als add
Danke für den Hinweis auf diesen Fehler. Bin ich peinlich, nicht bemerkt er mich, und ich habe korrigiert meine Antwort. (ti7 ' s Versuch, dies zu tun, wurde abgelehnt von Menschen, die nach den Regeln ein bisschen zu wörtlich.)
Leider kam ich jedoch nur gehört über dieses gerade jetzt, wenn ti7 versucht zu Bearbeiten meine Antwort - die bekommen wir nicht mitgeteilt, anderen Antworten auf eine Frage. Dies ist der Grund, warum kommentieren wäre besser gewesen, wenn Sie konnten.
InformationsquelleAutor András Czigány
Ich hasse es zu sagen, aber das ist fünf mal langsamer als die akzeptierte Antwort (die sich zehn mal langsamer als meine Antwort).
Ich bearbeitet meine Antwort und vorab-reservieren Sie die Größe der Ausgabe-string wie Caron erwähnt und Sie haben bereits. Ich bin gespannt, was denn jetzt sind die performance-Unterschiede zwischen meiner Lösung und bei dir?
Mein benchmark-Programm vorbelegte den Ausgabe-string für alle drei Fälle; der einzige Unterschied war der code innerhalb der for-Schleife.
InformationsquelleAutor Christian Ammer
strtol sollte den job tun, wenn Sie hinzufügen
0x
jede hex-Ziffer-pair-Mädchen.Ah, ich sehe. Ja, wollte nur eine schnelle Antwort, das ist natürlich nicht die beste Lösung (vor allem für C++).
InformationsquelleAutor schnaader