4 Stimmen

C++: Konvertiere unsigned long long int in vector<char> und umgekehrt

Kann mir jemand sagen, wie man unsigned long long int in einen Vektor und umgekehrt konvertiert?

Um von unsigned long long int in einen Vektor zu konvertieren, habe ich Folgendes versucht:

unsigned long long int x;
vector buf(sizeof(x));
memcpy( &buf[0], &x, sizeof( x ) );

Als ich es mit x = 1234567890 getestet habe, ist es fehlgeschlagen. Aber als ich es für kleinere Werte von x versucht habe (sagen wir 1-100), funktioniert es ...

Um einen Vektor in unsigned long long int zu konvertieren, habe ich Folgendes verwendet:

unsigned long long int =  (unsigned long long int)buf[0];

Kann mir jemand sagen, wie das geht?

0 Stimmen

Ja, ich versuche, das Ganzzahl in einen Vektor aufzuteilen, sodass ich es vom Client an den Server senden und wieder lesen kann.

0 Stimmen

Wenn du das tun möchtest, solltest du wahrscheinlich in Betracht ziehen, Mark B's Lösung in Template-Funktionen zu kombinieren, die beliebige Typen sicher in deinen vector schreiben/lesen können.

7voto

Mark B Punkte 93261

Denken Sie daran, dass das Kopieren von Bytes nicht plattformübergreifend tragbar sein wird. Dein memcpy sieht gut aus, warum also nicht dasselbe auf dem Rückweg rekonstruieren? Was du geschrieben hast, nimmt einfach das erste Byte des Vektors und konvertiert es in eine unsigned long long, was erklärt, warum es für kleine Zahlen funktioniert.

Versuchen Sie stattdessen, den Wert aus dem Vektor herauszuholen:

unsigned long long int x;
memcpy(&x, &buf[0], sizeof(x));

2 Stimmen

Hehe, und wenn Sie seinen aktuellen Ansatz auf einem Big-Endian-System ausprobieren würden, würde buf[0] nur etwas enthalten, wenn Sie einen wirklich großen Wert für x hätten.

4voto

Praetorian Punkte 103296

Statt direkt in den Vektor zu memcpyieren, können Sie std::vector::assign verwenden, um das Kopieren durchzuführen.

#include 
#include 

int main()
{
  unsigned long long int x = 0x0807060504030201;
  std::vector v;

  v.assign( reinterpret_cast( &x ), reinterpret_cast( &x ) + sizeof( x ) );

  for( auto i = v.begin(); i != v.end(); ++i ) {
    std::cout << std::hex << static_cast( *i ) << ' ';
  }
  std::cout << std::endl;

  // Zurück konvertieren
  auto y = *reinterpret_cast( &v[0] );
  std::cout << "y = " << std::hex << std::showbase << y << std::endl;

  return 0;
}

Ausgabe:

1 2 3 4 5 6 7 8 
y = 0x807060504030201

0 Stimmen

Wie speichern Sie es in umgekehrter Reihenfolge, das heißt, die Ausgabe des Druckens wird 8 7 6 5 4 3 2 1 sein?

1 Stimmen

@cygi1989 Verwende std::reverse. Nach v.assign(...); füge std::reverse(v.begin(), v.end()); hinzu.

0 Stimmen

Großartig. Ist es möglich, ihm den kleinstmöglichen Vektor zuzuweisen, sagen wir, ich habe eine Funktion, die die kleinste Anzahl von Bytes zurückgibt, die notwendig sind, um eine bestimmte Ganzzahl zu speichern. Wie würde ich das machen?

3voto

Björn Pollex Punkte 72424

Sie müssen Ihre letzte Zeile ändern:

memcpy( &buf[0], reinterpret_cast(&x), sizeof( x ) );

Bearbeiten Ich habe Unsinn geredet, diese Zeile ist in Ordnung, aber Ihre Konvertierung zurück ist schlecht - Sie konvertieren den Wert, anstatt den Zeiger:

unsigned long long int val = *reinterpret_cast(&buf[0]);

0 Stimmen

@MarkB: Das ist mir auch aufgefallen - war für einen Moment verwirrt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X