Go Down

Topic: Hexadezimalen String in DEC Integer konvertieren (Read 2722 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

#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