Cobol und die moderne Welt
Zufällig liefen mir heute Daten über den Weg, die aus einem in Cobol geschriebenen und zugegeben schon etwas älteren Programm stammen. Beim auseinandernehmen der Datenstrukturen stieß ich auf einen für mich ziemlich seltsam anmutenden Datentyp: comp-3.
Stell dir vor, du hast eine gegebene zahl 1234567, die du comp-3 codiert speicherst. Du gibst also 1234567 rein und kriegst hexadezimal 0x12, 0x34, 0x56, 0x7c raus.
Der Aufbau ist an sich recht leicht: Man packt jeweils eine Ziffer in ein 4-bit nybble (also ein teil-byte) und hängt ganz am Schluß noch mal in 4 bit ein "0xC" für positiv oder ein "0xD" für negativ an. Klingt logisch, nicht? Diese Komprimierung stammt noch aus der Zeit, als Speicher wirklich kostbar war, aber mußte man ausgerechnet so speicherplatz sparen?
Zum Glück gibt's heute Internet und immer ein paar Informationen zu seltsamen Datentypen im Netz zu finden ([1], [2]).
Einen schnellen Hack in Python zum Umwandeln nach Signed Integer stell ich mal rein, vielleicht brauchts irgendwann noch mal jemand:
- def comp3_to_signed_int(comp3):
- rnum = ""
- for nybble in comp3:
- inum = str(hex(ord(nybble)))
- inum = inum[2:]
- inum = inum.rjust(2, "0")
- rnum += inum
- if rnum.endswith("d"):
- rnum = rnum[:-1] * -1
- else:
- rnum = rnum[:-1]
- return rnum
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
Alexander am :
Marco am :
Frank Mattes am :
ich bin Anwendungsprogrammierer und schreibe Software in COBOL.
Zu dem 'seltsamen' Datentyp: Comp-3 wird auch 'Packed Decimal' genannt und hat zum Teil seinen Ursprung in der Grossrechnerarchitektur.
Die Prozessoren eines Grossrechners haben ein zusätzliches Rechenwerk in der ALU, das mit gepackten Zahlen rechnen kann.
Verwendet werden solche Zahlendarstellungen vor allem in Finanzanwendungen.
Der Vorteil ist, das mit diesen Binary Coded Decimals (BCD) Zahlen mit Nachkommastellen ohne Rundungsfehler ( im gegenssatz zu Fliesskommadarstellung wie foat oder double) dargestellt werden können.
Gruß, Frank