Go Down

Topic: Hexadezimalen String in DEC Integer konvertieren (Read 3192 times) previous topic - next topic

Joghurt


7: 7      3274
F: 15     52391
6: 6      51839
42998

Mooment! Der zeigt Dir hier anscheinend eine int, keine long! :)

Probier mal bei der abschließenden Ausgabe:
Code: [Select]
Serial.print(out>>16);
Serial.println(out&0xffff);


Werni

Hey Joghurt,
ich hab ein bisschen recherchiert und folgendes draus gemacht:
Code: [Select]

void setup() {
  Serial.begin(9600);
  char in[] = "00CCA7F6";
 
 
  //To DEZ
  int Zahlensystem = 16;
  int length = sizeof(in)-1;
  long out = 0;
  char newIn[length];
  for (byte t=0; t < length; t++) {
    Serial.print(in[t]); Serial.print("  ");
    if (in[t]>='0' && in[t]<='9')
      in[t] -= '0';
    if (in[t]>='A' && in[t]<='F')
      in[t] -= 'A'-10;
    if (in[t]<10) Serial.print(" ");
    Serial.print(in[t], DEC); Serial.print(" * 16^");
    out += in[t] * pow(Zahlensystem, length - t - 1);
    Serial.print(length - t - 1, DEC);
    Serial.print(" = ");
    Serial.println(in[t] * pow(Zahlensystem, length - t - 1));
  }
  Serial.println("------------");
  Serial.println(out, DEC);
}


Heraus kommt dann:
Quote

0    0 * 16^7 = 0.00
0    0 * 16^6 = 0.00
C  12 * 16^5 = 12582896.00
C  12 * 16^4 = 786431.43
A  10 * 16^3 = 40959.97
7    7 * 16^2 = 1792.00
F  15 * 16^1 = 240.00
6    6 * 16^0 = 6.00
------------
13412325


Sollwert: 13412342

Der Arduino macht wohl Rundungsgehler  :(

Joghurt

Das ist vermutlich das pow(), das ist leider nicht 100%ig... :(

MaFu

Bei so einer Umrechnung hat Pow() absolut nichts verloren.

Anstelle von
    out += in[t] * pow(Zahlensystem, length - t - 1);
schreibst Du entweder
    out = out * 16 + in[t];
oder am besten gleich
    out = out << 4 + in[t];

Da ja in[t] immer ein Nibble (4 Bit) ist, ist das letzte Beispiel nicht nur das schnellste sondern eigentlich auch das verständlichste. Du verschiebst das bisherige Ergebnis um 4 Bit nach links und machst somit Platz für die nächsten 4 Bit.
_______
Manfred

Werni

Hi MaFu,
out = out << 4 + in[t];
hat nicht funktioniert.
*16 aber schon.
Jetzt funktionert es.
Vielen Dank euch beiden,

Grüße
Werni

dominikh

#20
Aug 15, 2011, 09:28 pm Last Edit: Aug 15, 2011, 09:30 pm by dominikh Reason: 1
Von String mit Hex zu long:

Code: [Select]

#include <stdlib.h>

void setup()
{
 // anderer code hier
 char in[] = "00CCA7F6";
 long  out = strtol(in, NULL, 16);
 // anderer code hier
}

Werni

#21
Aug 15, 2011, 09:40 pm Last Edit: Aug 16, 2011, 12:21 am by Werni Reason: 1
Na toll -.-
und ich hab mich schon darüber aufgeregt, dass es nicht wie überall sonst eine Funktion dafür gibt.

df6ih

So richtig schön zum spielen hat das jemand hier gemacht:

http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm


MaFu


Hi MaFu,
out = out << 4 + in[t];
hat nicht funktioniert.
*16 aber schon.
Jetzt funktionert es.
Vielen Dank euch beiden,

Grüße
Werni

War für mich wohl noch zu früh am Morgen.
Der Shift-Operator hat eine niedrigere Rangfolge, es muss also so lauten:
out = (out << 4) + in[t];
_______
Manfred

looP

Also zum mitschreiben wäre das hier die Lösung???

Code: [Select]
void setup() {
  Serial.begin(9600);
  char in[] = "00CCA7F6";
 
 
  //To DEZ
  int Zahlensystem = 16;
  int length = sizeof(in)-1;
  long out = 0;
  char newIn[length];
  for (byte t=0; t < length; t++) {
    Serial.print(in[t]); Serial.print("  ");
    if (in[t]>='0' && in[t]<='9')
      in[t] -= '0';
    if (in[t]>='A' && in[t]<='F')
      in[t] -= 'A'-10;
    if (in[t]<10) Serial.print(" ");
    Serial.print(in[t], DEC); Serial.print(" * 16^");
    out = (out << 4) + in[t];
    Serial.print(length - t - 1, DEC);
    Serial.print(" = ");
    Serial.println(in[t] * pow(Zahlensystem, length - t - 1));
  }
  Serial.println("------------");
  Serial.println(out, DEC);
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy