En sjælden gang får jeg brug for at udskrive en variabel i dens hexadecimale værdi. Det kan være i SQL, fra REXX, COBOL eller PLI. For at kunne udskrive en hexadecimal værdi skal variablen konverteres og det gøres selvfølgelig på vidt forskellige måder. SQL og REXX har næsten fra fødslen haft indbyggede funktioner til at konvertere. Det kniber lidt mere for PLI og COBOL.
I SQL hedder funktionen HEX(expression) og virker præcis, som den skal. Første byte af resultatet af expression bliver konverteret til 2 hexadecimale tal i intervallet 0-F og så fremdeles.
Allerede i REXX bliver det en smule mere kompliceret idet der findes to funktioner til at konvertere med. Den ene hedder C2X(char-expression), mens den anden hedder D2X(numeric-expression). C2X('1') giver eksempelvis F1, mens D2X('1') giver 01. REXX-variable har ingen type, så derfor er man nødt til at fortælle REXX, hvordan input skal fortolkes, når der skal konverteres til HEX.
I PLI er der med Enterprise PL/I compileren kommet to funktioner til at konvertere til HEX. Den ene hedder HEX og virker som SQL HEX for tegnstrenge. Hvis man bruger den på numeriske variable (BINARY, REAL eller DECIMAL) sker der underlige ting, så lad være med det. For at håndtere de numeriske værdier har Enterprise PL/I en funktion kaldet HEXIMAGE, som fungerer præcis som HEX i SQL for alle typer af variable. Til gengæld skal den have adressen og længden på den variabel, der skal konverteres, så den er en smule mere besværlig at bruge.
Og til sidst er der jo klassens sorte får COBOL. Her er der ingen indbyggede funktioner, der kan hjælpe dig. Jeg har endda kigget på den allerseneste release af COBOL compileren, men COBOL gør sig ligesom ikke ret meget i indbyggede funktioner. Så er der selvfølgelig ikke andet at gøre end enten at kalde SQL HEX med en
hvilket er ret trist at skulle gøre, hvis ens program ikke bruger DB2. Så er der jo ikke andet at gøre end at kode konverteringen selv. Det findes der masser af kodestumper til ude på nettet. Det har den ulempe, at den samme kodestump hurtigt kommer til at ligge i mange forskellige programmer. Så kan man kode et COBOL underprogram til at lave konverteringen med. En sidste mulighed er at kode konverteringen i assembler, hvilket jeg har valgt at gøre, fordi så kan jeg anvende det samme program både fra COBOL og PLI (selvom PLI nu kan klare det selv) og andre kompilerende sprog på mainframen inklusive assembler. Hvis du kan finde ud af at kompilere et assembler modul på din installation, så kan du benytte følgende kode:
Dette program kaldes fra COBOL således:
Variablen to-be-converted kan være hvilken som helst type af variabel eller struktur. Det vigtigte er, at variablen hex-format (eller hvad du nu kalder den) fylder mindst dobbelt så mange bytes som to-be-converted, ellers risikerer du ubehagelige storage-overskrivninger.
Rigtige assembler programmører vil sandsynligvis pege fingre af mit CHR2HEX program, da det ikke benytter et snedigt assembler trick til at konvertere med. Jeg er ikke vildt skrap til assembler, så derfor benyttede jeg mig af en metode, jeg kunne overskue.