Ich möchte eine Hex-Zeichenfolge in eine 32-Bit-Ganzzahl mit Vorzeichen in C ++ konvertieren.
So habe ich zum Beispiel die Hex-Zeichenfolge "fffefffe". Die binäre Darstellung hierfür lautet 111111111111111011111111111110. Die vorzeichenbehaftete Ganzzahldarstellung hierfür lautet: -65538.
Wie mache ich diese Konvertierung in C ++? Dies muss auch für nicht negative Zahlen funktionieren. Zum Beispiel die Hex-Zeichenfolge "0000000A", die 00000000000000000000000000001010 in binär und 10 in dezimal ist.
int
. "32-Bit-Ganzzahl mit Vorzeichen" könnte int32_t oder __int32 usw. sein.Antworten:
verwenden
std::stringstream
Das folgende Beispiel ergibt
-65538
das Ergebnis:Im neuen C ++ 11-Standard gibt es einige neue Dienstprogrammfunktionen, die Sie verwenden können! Insbesondere gibt es eine Familie von "String to Number" -Funktionen ( http://en.cppreference.com/w/cpp/string/basic_string/stol und http://en.cppreference.com/w/cpp/string/). basic_string / stoul ). Dies sind im Wesentlichen dünne Wrapper um Cs Funktionen zur Konvertierung von Zeichenfolgen in Zahlen, die jedoch wissen, wie man mit a umgeht
std::string
Die einfachste Antwort für neueren Code würde also wahrscheinlich so aussehen:
HINWEIS: Unten ist meine ursprüngliche Antwort, die, wie in der Bearbeitung angegeben, keine vollständige Antwort ist. Für eine funktionale Lösung kleben Sie den Code über die Zeile :-).
Es scheint, dass da
lexical_cast<>
eine Stream-Konvertierungssemantik definiert ist. Leider verstehen Streams die "0x" -Notation nicht. Also gehen sowohl dieboost::lexical_cast
als auch meine Hand gerollt nicht gut mit Hex-Saiten um. Die obige Lösung, bei der der Eingabestream manuell auf hex gesetzt wird, funktioniert einwandfrei.Boost hat auch einige Dinge zu tun, die auch einige nette Funktionen zur Fehlerprüfung bieten. Sie können es so verwenden:
Wenn Sie keine Lust auf Boost haben, finden Sie hier eine leichte Version der lexikalischen Besetzung, die keine Fehlerprüfung durchführt:
die Sie so verwenden können:
quelle
std::hex
stringstream
s sollte man überprüfenss.good() && ss.eof()
, ob keine Fehler aufgetreten sind.Für eine Methode, die sowohl mit C als auch mit C ++ funktioniert, sollten Sie die Standardbibliotheksfunktion strtol () verwenden.
quelle
strtoul
nicht verwendenstrtol
. Es wird+ overflow
bei der Verwendung von strtol sein. Mitstrtoul
gibt es keinen Überlauf und der zurückgegebene Wert wird konvertiertlong
, um ein korrektes Ergebnis zu erzielen (-65538). Also deine Antwort fast richtig :)Andy Buchanan, was das Festhalten an C ++ angeht, hat mir deins gefallen, aber ich habe ein paar Mods:
Gebraucht wie
Auf diese Weise benötigen Sie kein impl pro int-Typ.
quelle
Arbeitsbeispiel mit
strtoul
wird sein:strtol
konvertiertstring
zulong
. Auf meinem Computernumeric_limits<long>::max()
gibt0x7fffffff
. Offensichtlich0xfffefffe
ist das größer als0x7fffffff
. Sostrtol
kehrtMAX_LONG
statt wollte Wert.strtoul
konvertiertstring
zuunsigned long
deshalb kein Überlauf in diesem Fall.Ok,
strtol
erwägt, dass die Eingabezeichenfolge vor der Konvertierung nicht als vorzeichenbehaftete 32-Bit-Ganzzahl verwendet wird. Lustige Probe mitstrtol
:Der obige Code wird
-65538
in der Konsole gedruckt .quelle
Hier ist eine einfache und funktionierende Methode, die ich an anderer Stelle gefunden habe:
Bitte beachten Sie, dass Sie möglicherweise die Verwendung einer vorzeichenlosen langen Ganzzahl / langen Ganzzahl bevorzugen, um den Wert zu erhalten. Ein weiterer Hinweis: Die Funktion c_str () konvertiert nur den std :: string in const char *.
Wenn Sie also ein const char * bereit haben, verwenden Sie einfach diesen Variablennamen direkt, wie unten gezeigt [Ich zeige auch die Verwendung der vorzeichenlosen langen Variablen für eine größere Hex-Zahl. Verwechseln Sie es nicht mit dem Fall, dass const char * anstelle von string] verwendet wird:
Dies funktioniert einwandfrei (vorausgesetzt, Sie verwenden die für Sie erforderlichen Datentypen).
quelle
Ich hatte heute das gleiche Problem. So habe ich es gelöst, damit ich lexical_cast <> behalten kann
(Fand diese Seite, als ich nach einem weniger blöden Weg suchte :-)
Prost, A.
quelle
Das hat bei mir funktioniert:
quelle
Versuche dies. Diese Lösung ist etwas riskant. Es gibt keine Schecks. Die Zeichenfolge darf nur Hex-Werte haben und die Zeichenfolgenlänge muss mit der Größe des Rückgabetyps übereinstimmen. Es sind jedoch keine zusätzlichen Header erforderlich.
Verwendung:
Hinweis: Die Länge der Zeichenfolge muss durch 2 teilbar sein
quelle