Ganzzahl in Hex-String in C++

Lesezeit: 5 Minuten

Ganzzahl in Hex String in C
kryptobs2000

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.

1646911811 608 Ganzzahl in Hex String in C
Kornel Kisielewicz

Verwenden <iomanip>‘S std::hex. Wenn Sie drucken, senden Sie es einfach an std::coutwenn nicht, dann verwenden std::stringstream

std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );

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:

stream << std::setfill ('0') << std::setw(sizeof(your_type)*2) 
       << std::hex << your_int;

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.

template <typename I> std::string n2hexstr(I w, size_t hex_len = sizeof(I)<<1) {
    static const char* digits = "0123456789ABCDEF";
    std::string rc(hex_len,'0');
    for (size_t i=0, j=(hex_len-1)*4 ; i<hex_len; ++i,j-=4)
        rc[i] = digits[(w>>j) & 0x0f];
    return rc;
}

  • 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::stringstream sstream;
sstream << std::hex << my_integer;
std::string result = sstream.str();

Ganzzahl in Hex String in C
vitaut

Das geht mit C++20 std::format:

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.

    – Mark Lakata

    9. Januar 2019 um 23:02 Uhr

#include <boost/format.hpp>
...
cout << (boost::format("%x") % 1234).str();  // output is: 4d2

  • 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.

    – Mark Lakata

    9. Januar 2019 um 23:02 Uhr

1646911812 880 Ganzzahl in Hex String in C
Peter Mortensen

Sie können Folgendes versuchen. Es funktioniert…

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

template <class T>
string to_string(T t, ios_base & (*f)(ios_base&))
{
  ostringstream oss;
  oss << f << t;
  return oss.str();
}

int main ()
{
  cout<<to_string<long>(123456, hex)<<endl;
  system("PAUSE");
  return 0;
}

  • eine nette Antwort, aber Vorsicht to_string ist Teil des Namensraums std in C++11

    – Alexander Ach

    3. Juni 2014 um 9:00 Uhr

  • @Alex ja, es ist immerhin 2014 … Gott bewahre, wir müssen uns bald mit C ++ 14 befassen.

    – Alex

    22. Juni 2014 um 13:53 Uhr

987740cookie-checkGanzzahl in Hex-String in C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy