Wie konvertiere ich eine Ganzzahl in eine Hex-Zeichenfolge in C++?
Ich kann einige Möglichkeiten finden, dies zu tun, aber sie scheinen hauptsächlich auf C ausgerichtet zu sein. Es scheint, dass es in C++ keine native Möglichkeit gibt, dies zu tun. Es ist jedoch ein ziemlich einfaches Problem; Ich habe eine int die ich zum späteren Drucken in einen Hex-String umwandeln möchte.
Kornel Kisielewicz
Verwenden <iomanip>‘S std::hex. Wenn Sie drucken, senden Sie es einfach an std::coutwenn nicht, dann verwenden std::stringstream
Sie können die erste voranstellen << mit << "0x" oder was auch immer Sie möchten, wenn Sie möchten.
Andere Manips von Interesse sind std::oct (oktal) und std::dec (zurück zur Dezimalzahl).
Ein Problem, auf das Sie möglicherweise stoßen, ist die Tatsache, dass dies genau die Anzahl von Ziffern ergibt, die zur Darstellung erforderlich sind. Sie dürfen verwenden setfill und setw das um das problem zu umgehen:
Abschließend würde ich eine solche Funktion vorschlagen:
template< typename T >
std::string int_to_hex( T i )
{
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
@MSalters – ganz im Gegenteil. Testen Sie Ihren Vorschlag auf der int Art 😉
– Kornel Kisielewicz
24. Februar 2011 um 10:13 Uhr
@LexFridman, um genau die Menge an Hexadezimalziffern auszugeben, die benötigt wird. Warum 8 Ziffern ausgeben, wenn der Typ ein uint8_t ist?
– Kornel Kisielewicz
31. Dezember 2012 um 5:41 Uhr
WARNUNG: Dies funktioniert nicht für einzelne Bytes, da char immer als char bedroht wird
– ov7a
15. Februar 2016 um 9:36 Uhr
Sie benötigen außerdem #include
– David Gausmann
21. Februar 2018 um 15:57 Uhr
Wenn ich mehrere Ints formatiere, scheint es so std::setw muss für jeden int an den Stream ausgegeben werden, wohingegen std::hex, std::setfill, std::uppercase, … müssen nur einmal an den Ausgabestrom gesendet werden. Das erscheint widersprüchlich?
– wcochran
27. Juni 2018 um 21:53 Uhr
Um es leichter und schneller zu machen, schlage ich vor, das direkte Füllen einer Schnur zu verwenden.
Funktioniert das für jeden Typ? Ich meine auch double, float, uint8_t?
– SR
8. August 2017 um 15:13 Uhr
@SR Es funktioniert für ganzzahlige Typen, nicht für double und float (und nicht für Zeiger)
– Wolf
6. Februar 2018 um 12:29 Uhr
… eine sehr pragmatische (aber gültige) Mischung aus C und C++, bei der Geschwindigkeit bin ich mir nicht sicher … für meinen Geschmack ist sie etwas dicht.
– Wolf
6. Februar 2018 um 12:36 Uhr
Danke, geniale Antwort. Es scheint eine solche Verschwendung zu sein, eine Stream-Bibliothek “nur” dafür einzubringen.
– EntwicklerChris
16. Juni 2018 um 8:25 Uhr
Das druckt 0000FFFF zum 0xFFFF. Ich habe lieber 0xFFFF als Ausgang.
– Trommel
22. April 2020 um 9:03 Uhr
Verwenden std::stringstream zum Konvertieren von ganzen Zahlen in Strings und seine speziellen Manipulatoren zum Setzen der Basis. Zum Beispiel so:
std::string s = std::format("{:x}", 42); // s == 2a
Noch bis std::format ist weit verbreitet, die Sie verwenden können die {fmt}-Bibliothek, std::format basiert auf (Gottriegel):
std::string s = fmt::format("{:x}", 42); // s == 2a
Haftungsausschluss: Ich bin der Autor von {fmt} und C++20 std::format.
Geben Sie es einfach als Hexadezimalzahl aus:
int i = /* ... */;
std::cout << std::hex << i;
ich würde … benutzen std::cout<<std::hex<<i<<std::dec;, andernfalls sind alle später gestreamten Integer im Hexadezimalformat. Für die anderen Antworten, die verwenden, müssen Sie dies nicht tun stringstream weil der Stream verworfen wird, nachdem er verwendet wurde, aber cout lebt für immer.
ich würde … benutzen std::cout<<std::hex<<i<<std::dec;, andernfalls sind alle später gestreamten Integer im Hexadezimalformat. Für die anderen Antworten, die verwenden, müssen Sie dies nicht tun stringstream weil der Stream verworfen wird, nachdem er verwendet wurde, aber cout lebt für immer.