BCD Code in HEX Code konvertieren
-
Hallo,
hat jemand eine schnelle Lösung parat, um einen BCD codierten Wert in einen hexadezimalen Wert umzurechnen. Leider passt der vermutlich entstehende HEX Wert auch nicht in eine 32-Bit Variable. Hierzu wäre noch ein Überschlag in eine zweite Variable erforderlich.
BCD codierter Wert, z.Bsp.: 00 00 04 60 22 12 75 (14 digit decimal)
Vielen Dank!
-
template <typename Integer> Integer bcd_to_int (Integer bcd) { Integer res = 0, p = 1; for (int i = 0; i < sizeof(Integer) * 2; ++i, p *= 10) { res += (bcd & (0x0f << i)) * p; res += (bcd & (0xf0 << i)) * (p *= 10); } return res; }
Ungetestet.
-
Hallo,
ich setze für den BCD Code (bcd) 0x12345678;
Errechnet wird (res) 0x9E270648;Mein Taschenrechner errechnet aber 0x00BC614E;
Schade!
-
War auch nicht so doller Code
template <typename Integer> Integer bcd_to_int (Integer bcd) { Integer res = 0; for (Integer p = 1; bcd; p *= 10) { res += (bcd & 0xf) * p; bcd >>= 4; } return res; }
Übertrag brauchst du eigentlich nicht, nimm entweder long long (64 Bit) oder lass dir die Umwandlung getrennt für den oberen und den unteren Teil berechnen.
-
Hallo,
das mit der 64 Bit Variablen war auch mein erster Gedanke. Leider kann mein C-Compiler keine 64 Bit Variable anlegen. Zumindest weiß ich nicht im Geringsten, wie? Die Software läuft auf einem Fujitsu Controller. Ich dachte ich könnte den HEX Wert irgendwie auf ein Array verteilen. Jeder 20€-Taschenrechner kann das.
Aber wie?
Trotzdem vielen Dank!
-
Das Problem bei dem ganzen Umhergeschiebe von Bits ist ja, dass es unterschiedliche Möglichkeiten gibt, Daten im Speicher abzulegen. Um plattformunabhängig zu bleiben, bleibt dir wohl nichts anderes übrig, als die Sache mathematisch anzugehen.
Die Systematik bei Binary Coded Decimals ist recht simpel. Hier wird je dezimaler Ziffer ([0 - 9] daher insgesamt 10 Varianten erforderlich) die kleinstmögliche binäre Repräsentation gewählt.
Erforderlich wären hier 4 Bits. 4 Bits entsprechten einem Wertbereich von 0 - 15.
3 Bits sind demnach zu wenig, da hier nur ein Wertbereich von 0 - 8 abgedeckt werden kann.Zwei Ziffern a, b [0 >= (a, b) <= 9] können wie folgt kodiert werden:
c = a * 16 + b
Dekodieren kann man die beiden Ziffern aus dem Wert c, in dem man die entsprechende Umkehroperation durchführt, bzw. deren Rest berücksichtigt (Modulo):
a = c / 16
b = c % 16Kodieren und Dekodieren von mehr als zwei Ziffern kann man durch iterative Anwendung der oben genannten Terme.
Grüße... Heiko
-
Hallo,
das mit der Codierung und Decodierung schaff ich schon. Das Problem ist, es bleibt mir keine Möglichkeit den Hexadezimalen Wert irgenwie in eine Variable zu speichern, wenn der errechnete Wert 0xFFFFFFFF übersteigt.mfG.
-
Hier bleibt dir wohl nichts anderes übrig, als mit Datenfeldern zu arbeiten oder auf eine Klasse zurückzugreifen, welche größere Integerwerte, als die Registerbreite zulässt.
Letztere Variante ist sicherlich diejenige, welche
- sich einfacher umsetzen lässt
- robuster ist
- lesbarer ist
vorausgesetzt die oben genannten Operatoren sind überladen.
https://sourceforge.net/projects/cpp-bigint/
Grüße... Heiko