Verwenden Sie <iomanip>
's std::hex
. Wenn Sie drucken, senden Sie es einfach an std::cout
, wenn nicht, dann verwenden Siestd::stringstream
std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
Sie können das erste <<
mit << "0x"
oder nach Belieben voranstellen, wenn Sie möchten.
Andere interessante Manips sind std::oct
(oktal) und std::dec
(zurück zur Dezimalstelle).
Ein Problem, auf das Sie möglicherweise stoßen, ist die Tatsache, dass dies genau die Anzahl der Stellen ergibt, die zur Darstellung erforderlich sind. Sie können setfill
und setw
dies verwenden, um das Problem zu umgehen:
stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;
Zum Schluss 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();
}
Kornel Kisielewicz
quelle
int
Typ;)std::setw
Bedarf für jeden int Ausgabe an den Strom zu sein, währendstd::hex
,std::setfill
,std::uppercase
, ... nur einmal in den Ausgabestream gesendet werden müssen. Das scheint inkonsistent?Um es leichter und schneller zu machen, schlage ich vor, eine Schnur direkt zu füllen.
quelle
double
undfloat
(und nicht für Zeiger)0000FFFF
für0xFFFF
. Ich bevorzuge0xFFFF
als Ausgabe zu haben .Verwenden Sie
std::stringstream
diese Option , um Ganzzahlen in Zeichenfolgen umzuwandeln, und verwenden Sie spezielle Manipulatoren, um die Basis festzulegen. Zum Beispiel so:quelle
Drucken Sie es einfach als Hexadezimalzahl aus:
quelle
std::cout<<std::hex<<i<<std::dec;
, sonst werden alle Ganzzahlen, die später gestreamt werden, hexadezimal sein. Sie müssen dies nicht für die anderen Antworten tun, die verwendet werden,stringstream
da der Stream nach seiner Verwendung verworfen wird, abercout
für immer lebt.Sie können Folgendes versuchen. Es funktioniert...
quelle
to_string
ist Teil des Namespacestd
in C ++ 11Diese Frage ist alt, aber ich bin überrascht, warum niemand erwähnt hat
boost::format
:quelle
quelle
Dank Lincolns Kommentar unten habe ich diese Antwort geändert.
Die folgende Antwort behandelt 8-Bit-Ints zur Kompilierungszeit ordnungsgemäß. Es erfordert jedoch C ++ 17. Wenn Sie nicht über C ++ 17 verfügen, müssen Sie etwas anderes tun (z. B. Überladungen dieser Funktion bereitstellen, eine für uint8_t und eine für int8_t, oder etwas anderes als "if constexpr" verwenden, möglicherweise enable_if).
Ursprüngliche Antwort, die 8-Bit-Ints nicht richtig verarbeitet, wie ich dachte:
Die Antwort von Kornel Kisielewicz ist großartig. Ein kleiner Zusatz hilft jedoch dabei, Fälle zu erfassen, in denen Sie diese Funktion mit Vorlagenargumenten aufrufen, die keinen Sinn ergeben (z. B. float) oder die zu unordentlichen Compilerfehlern führen würden (z. B. benutzerdefinierter Typ).
Ich habe dies bearbeitet, um std :: to_string einen Aufruf hinzuzufügen, da 8-Bit-Integer-Typen (z. B. übergebene
std::uint8_t
Werte)std::stringstream
als char behandelt werden, wodurch Sie nicht das gewünschte Ergebnis erhalten. Das Übergeben solcher Ganzzahlen,std::to_string
um sie korrekt zu behandeln, schadet nichts, wenn andere, größere Ganzzahltypen verwendet werden. Natürlich kann es in diesen Fällen zu einem leichten Leistungseinbruch kommen, da der Aufruf von std :: to_string nicht erforderlich ist.Hinweis: Ich hätte dies nur in einem Kommentar zur ursprünglichen Antwort hinzugefügt, aber ich habe nicht den Repräsentanten, um einen Kommentar abzugeben.
quelle
char
(was sich von beidenuint8_t
undint8_t
in den meisten Implementierungen unterscheidet (wo sie sich jeweils befindenunsigned char
undsigned char
)).... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>
etc ...Für diejenigen unter Ihnen, die herausgefunden haben, dass viele / die meisten
ios::fmtflags
noch nicht mitstd::stringstream
der Vorlagenidee arbeiten, die Kornel vor langer Zeit veröffentlicht hat, funktioniert Folgendes und ist relativ sauber:quelle
Ich mache:
Schauen Sie sich die SO- Antwort von iFreilicht und die erforderliche Template-Header-Datei von hier an. GIST !
quelle
Schauen Sie sich einfach meine Lösung an, [1] die ich wörtlich aus meinem Projekt kopiert habe, damit dort ein deutsches API-Dokument enthalten ist. Mein Ziel war es, Flexibilität und Sicherheit innerhalb meiner tatsächlichen Bedürfnisse zu kombinieren: [2]
0x
Präfix hinzugefügt: Anrufer kann entscheidenlong long
[1] basierend auf der Antwort von Kornel Kisielewicz
[2] In die Sprache von CppTest übersetzt lautet dies folgendermaßen:
quelle
TEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Code als Referenz:
quelle
clear
diesstream
(wird es , wenn die Funktion zurückkehrt sowieso in der nächsten Zeile zerstört werden). Sie können den NamenhexStr
ganz und einfach vermeiden,return sstream.str();
ohneclear
den gleichen Effekt zu erzielen, indem Sie vier Codezeilen auf eine reduzieren.sstream.clear();
? Dassstream
Objekt wird am Ende des Bereichs automatisch zerstörtreturn sstream.str();
.sstream.clear
löscht nur den Inhalt, bevor der Stream mit dem Ende des Bereichs endet (um alle Fehler- und Eof-Flags mit clear zu löschen). In der Tat, wenn der Bereich stirbt, mit der Lebensdauer der Stream-Variablen, undsstream.str
kann daher verwendet werden, um nach Wert zurückzukehren. [Referenz: cplusplus.com/reference/ios/ios/clear/]Meine Lösung. Es sind nur ganzzahlige Typen zulässig.
Aktualisieren. Sie können das optionale Präfix 0x im zweiten Parameter festlegen.
definition.h
main.cpp
Ergebnisse:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffe
fe
fe FFFFFFFE
fffffffffffffffe
quelle
Ich möchte eine Antwort hinzufügen, um die Schönheit der C ++ - Sprache zu genießen. Seine Anpassungsfähigkeit an Arbeiten auf hohem und niedrigem Niveau. Viel Spaß beim Programmieren.
Beispiele:
quelle
Void-Zeiger verwenden:
0x hinzufügen:
Ausgänge:
quelle
0x69fec4 (Adresse)
6946500 (Adresse zu dec)
0x69fec4 (Adresse zu dec, Ausgabe in hex)
ging instinktiv mit diesem ...
int address = (int) & var;
habe das woanders gesehen ...
unsigned long address = reinterpret_cast (& var);
Kommentar sagte mir, dass dies korrekt ist ...
int address = (int) & var;
Apropos gut bedeckte Leichtigkeit, wo bist du? Sie bekommen zu viele Likes!
quelle
unsigned long
aber nichtstd::intptr_t
.intptr_t
kann einen beliebigen Zeiger auf der Build-Plattform speichern. das ist nicht [notwendigerweise] wahrunsigned int
. Und auch hier ist nichts davon für die Frage relevant. Keine weiteren Antworten von mir