Hex Werte in dez umwandeln
-
Hallo Leute,
ich habe mal wieder eine Frage und hoffe, dass ihr mir helfen könnt.
Ich habe folgendes Problem:
Um das vorweg zu nehmen, ich weiß natürlich um die Zahlendarstellung intern zwecks hex, dez und okt, aber das löst leider mein Problem nicht oder ich habe mich wieder irgendwo verrannt.

Ich bekomme ein 8Byte-langes Datenframe, welches ich für meine Zwecke umwandeln und aufsplitten muss.
Dies sieht in meiner Simulation wie folgt aus:
1E 01 A4 62 1B 00 00 00
Dieses wird mir beim Aufruf der Funktion als ein const uint8_t *buffer zur Verfügung gestellt.
Über buffer[i] kann ich nun auf die einzelnen Bytes zugreifen.
Ich hoffe, ich habe es verständlich erklärt, wenn nicht bitte nochmal nachhaken, meist übersieht man das wesentliche, wenn man es Unbeteiligten erklärt

Mein Problem ist jetzt die Darstellung und Umwandlung:
Meine Funktion:
void Signal(const uint8_t* buffer) { cout << "Signal: "; printf("0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6]); cout << "Value: "; printf("0x%02x\n", buffer[0]); cout << hex << buffer[0] << endl; cout << dec << buffer[0] << endl; int val; stringstream ss; ss << hex << buffer[0]; ss >> val; cout << "Wert: " << val << endl; }Man sieht, ich habe schon viel probiert :p
Mit printf bekomme ich die Werte auch prima raus.
Aber auch da weiß ich nicht, wie ich diese jetzt in ein int als dezimalwert bekomme, um damit rechnen zu können.Mit cout oder mit sstream zu int bekomme ich nichtmal vernünftige Werte, sondern nur eine Tilde.

Wie kann ich das vernünftig und geschickt in C++ lösen ?
Bzw. Wo ist mein Denkfehler ? Was übersehe ich ?Ausgabe:
Signal: 0x7e, 0x00, 0x6f, 0x6f, 0x0b, 0x00, 0x00 Value: 0x7e ~ ~ Wert: 0Danke schonmal an alle, die versuchen mir zu helfen

-
Tuxx schrieb:
Um das vorweg zu nehmen, ich weiß natürlich um die Zahlendarstellung intern zwecks hex, dez und okt, aber das löst leider mein Problem nicht oder ich habe mich wieder irgendwo verrannt.

Was meinst du denn darüber zu wissen? Die Wahrheit ist nämlich, dass es überhaupt keine interne Zahlendarstellung gibt. Intern sind Zahlen, nun ja, Zahlen. Darstellungen sind bloß etwas, das mit der Ausgabe zu tun hat, nicht mit Rechnen.
-
Dein uint8_t ist wohl ein typedef für char.
-
manni66 schrieb:
Dein uint8_t ist wohl ein typedef für char.
unsigned char
-
@DirkB
Da bin ich pingelig. Der Datentyp uint8_t ist für mich eine vorzeichenlose 8Bit Zahl. Der char Datentyp ist für mich eine 8Bit Zahl interpretiert als ASCII.Übrigens die Definition ist in stdint.h!
@Tuxx
strol?
-
Das Problem ist wie schon angesprochen, dass auf den meisten Systemen uint8_t nur ein typedef dür unsigned char ist und cout das dann auch als unsigned char ausgeben möchte. Ein einfacher Trick ist das Verwenden des unären + um Integer Promotion zu kriegen und so den unsigned char Wert zu einem int konvertieren, sodass cout den tatsächlichen Zahlenwert darstellt:
cout << hex << +buffer[0] << endl;
-
Hallo Tuxx,
auf das offensichtlichste bist du aber anscheinend nicht gekommen:
int val = buffer[0];Oder aber bei der Ausgabe explizit
cout << hex << static_cast<int>(buffer[0]) << endl; // bzw. (int)buffer[0]Willst du denn nur einzelne Bytes bearbeiten oder aber stellen mehrere Bytes einen Zahlenwert dar (z.B. 4 Bytes)
Hantierst du evtl. mit CAN-Daten?
-
Hallo Leute,
entschuldigt, dass ich mich erst jetzt melde, aber bis jetzt war leider keine Zeit.
Ich konnte aber zwischendrin reinschauen und eure Vorschläge ausprobieren.
Ja, ich arbeite mit CAN Daten und ja das offensichtliche hab ich nicht gesehen und es funktioniert.
Und nochmal ja
- ich muss einzelne bytes nehmen und diese selbst auch nochmal teilen. das hab ich alles mit shiften gemacht 
-
Bitte ein Bit schrieb:
@DirkB
Da bin ich pingelig. Der Datentyp uint8_t ist für mich eine vorzeichenlose 8Bit Zahl.Darum habe ich die Aussage von manni66 auf
unsignedverbessert.
Beicharist es System/Compiler/EinstellungsabhängigBitte ein Bit schrieb:
Der char Datentyp ist für mich eine 8Bit Zahl interpretiert als ASCII.
Da bist du aber sehr eingeschränkt. Weder 8 Bit noch ASCII sind vorgegeben.