Pages: 1 [2]   Go Down
Author Topic: Hexadezimalen String in DEC Integer konvertieren  (Read 1653 times)
0 Members and 1 Guest are viewing this topic.
Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

7: 7      3274
F: 15     52391
6: 6      51839
42998
Mooment! Der zeigt Dir hier anscheinend eine int, keine long! smiley

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

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hey Joghurt,
ich hab ein bisschen recherchiert und folgendes draus gemacht:
Code:
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  smiley-sad
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist vermutlich das pow(), das ist leider nicht 100%ig... smiley-sad
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 9
Posts: 642
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

_______
Manfred

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Grüße
Werni
Logged

Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 34
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Von String mit Hex zu long:

Code:
#include <stdlib.h>

void setup()
{
  // anderer code hier
  char in[] = "00CCA7F6";
  long  out = strtol(in, NULL, 16);
  // anderer code hier
}
« Last Edit: August 15, 2011, 02:30:07 pm by dominikh » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Na toll -.-
und ich hab mich schon darüber aufgeregt, dass es nicht wie überall sonst eine Funktion dafür gibt.
« Last Edit: August 15, 2011, 05:21:30 pm by Werni » Logged

Heidelberg
Offline Offline
Full Member
***
Karma: 1
Posts: 207
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Logged

 

Munich/Germany
Offline Offline
God Member
*****
Karma: 9
Posts: 642
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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];
Logged

_______
Manfred

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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);
}
Logged

Pages: 1 [2]   Go Up
Jump to: