Hex zu Dez (BCD) in C

OP #7363030
Lesenswert?

Hallo, ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische Wert gleich bleiben soll, also keine normale Konvertierung.

Ich möchte also aus 32112345dec eine 0x32112345 machen.

Ich finde ein paar Beispiele im internet, die wandeln aber in string um was auf meinem msp430 nicht klappt, ich habe den Datentyp string hier nicht. evt. mit char[], aber die länge wäre in meinem Fall hier stets anders.

Ursprünglich wollte ich die max. 4 Byte große Zahl in einzelen Bytes zerlegen und mit 16 multiplizieren. Beim kleinesten Byte klappt das halbwegs, zumindest bis ich bis 100d komme, dann scheitert es "irgendwo" am Überlauf...

1
45d = 0x2D
2
0x2D / 0x0A = 4    // ermittle Anzahl Überlauf von einer auf zehner
3
4 * 6 = 24d         // Anzahl Überlauf * differenz Überlauf (0x10 - 10dec = 6dec)  
4
24d + 45d = 69d == 0x45  // Wert Überlauf + eigentliche Wert (Einer)
5

6
Das funktioniert bis 99d
7
99d = 0x63
8
0x63 / 0x0A = 9
9
9 * 6 = 54d
10
54d + 99d = 153d == 0x99
11

12

13
ab 100d funktiert es nicht mehr
14
100d = 0x64
15
0x64 / 0x0A = 10
16
10 * 6 = 60d
17
60d + 100d = 160d == 0xA0  / hier sollte 0x100 stehen!
18

19

20
245d = 0xF5
21
0xF5 / 0x0A = 24d
22
24 * 6 = 144d
23
144d + 245d = 389d == 0x185 / hier sollte 0x245 stehen

Mir ist klar, dass der Fehler im Beispiel oben in Zeile 15+16 bzw. 21+22 liegt. Aber ich verstehe nicht wie ich hier die zweite Stelle des Überlaufs verrechnen muss. Vlt. kann mir jemand von Euch einen Tipp geben!?

#7363032
Lesenswert?

Jeffrey L. schrieb:

ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische Wert gleich bleiben soll, also keine normale Konvertierung.

Ich möchte also aus 32112345dec eine 0x32112345 machen.

Das widerspricht sich irgendwie.

Du möchstest nicht "von hex in Dec umwandeln", Du möchstest Dezimal in (gepacktes) BCD konvertieren.

https://en.wikipedia.org/wiki/Binary-coded_decimal#Packed_BCD

Das geht so:

1
uint64_t toBcd(uint32_t decVal)
2
{
3
  uint64_t bcdSum = 0;
4
  uint32_t mulDigit = 1;
5

6
  while (decVal > 0 )
7
  {
8
    bcdSum += mulDigit * (decVal % 10);
9
    mulDigit <<= 4;
10
    decVal /= 10;
11
  }
12

13
  return bcdSum;
14
}

Dran denken: Eine 32-Bit-Binärzahl (Wertebereich 0 - 4294967295) kann größer werden als eine 32-Bit-BCD-Zahl (Wertebereich 0 - 99999999), deswegen uint64_t als Rückgabewert.

#7363041
Lesenswert?

Jeffrey L. schrieb:

Hallo, ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische Wert gleich bleiben soll, also keine normale Konvertierung.

Ich möchte also aus 32112345dec eine 0x32112345 machen.

Vielleicht sortierst du deine Gedanken noch einmal neu.

Eine "Zahl" in C als numerischer Wert, mit dem du rechnen kannst (z.B. ein int oder unsigned int) ist weder dec noch hex noch sonstwas. Da musst du nichts "umwandeln".

Das Zahlensystem kommt erst dann ins Spiel, wenn du Daten ein- oder ausgibst, und da zwischen einer String-Repräsentation des Wertes und int wandeln musst. Das machen scanf/printf für dich.

Mit den Strings kannst du dann aber nicht rechnen.

Oliver

#7363045
Lesenswert?

Jeffrey L. schrieb:

ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische Wert gleich bleiben soll, also keine normale Konvertierung.

Ich möchte also aus 32112345dec eine 0x32112345 machen.

Eine Zahl mit der Dezimaldarstellung 32112345dec, hat zwingend in Hex-Darstellung den Wert 0x01E9FED9. Daran wirst du nichts ändern können. Umgekehrt hätte eine Zahl mit Hex-Darstellung 0x32112345 die Dez-Darstellung 839983941dec.

Ob Hex oder Dez ist nur eine Frage der Darstellung. Du willst aber anscheinen genau den numerischen Wert ändern, auch wenn du dir das nicht eingestehen willst.

Bevor du über die Implementierung eines Algorithmus nachdenkst, solltest du dir erstmal klar werden, was du willst.

Beitrag #7363080 wurde von einem Moderator gelöscht.
#7363094
Lesenswert?

Jeffrey L. schrieb:

ich möchte in C eine Zahl von hex in Dec umwandeln, wobei der numerische Wert gleich bleiben soll, also keine normale Konvertierung.

Ich möchte also aus 32112345dec eine 0x32112345 machen.

Erstens ist das eine Umwandlung von Dez nach Hex, nicht von Hex nach Dez.

Zweitens ist die Umwandlung ganz einfach, man löscht hinten das "dec" und fügt vorne "0x" an. Nun sind aber 32112345dec und 0x32112345 zwei unterschiedliche Zahlen. Wenn man die eine in die andere umwandeln möchte, verändert sich der numerische Wert. Das läßt sich nicht vermeiden, es sei den man erfindet eine neue, nicht widerspruchsfreie Mathematik.

Deine Beschreibung deutet darauf hin, daß Du ganz grundsätzlich etwas nicht oder falsch verstanden hast.

Auch in Deiner Rechnung geht bei mir der Fehler schon in Zeile 3 los, wozu eine Multiplikation mit 6?

Gruß Klaus (der soundsovielte)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren