MainframeSupports
tip uge 13/2009:

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

EXEC SQL
  SET :hexvalue = HEX(:cobolvariable)
END-EXEC

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:

CHR2HEX  CSECT
CHR2HEX  AMODE ANY
CHR2HEX  RMODE ANY
         BAKR  R14,0
         BASR  R12,0
         USING *,R12
         L     R2,0(R1)
         L     R3,4(R1)
         L     R3,0(R3)
         LTR   R3,R3
         BNP   CHR2HEXR
         L     R4,8(R1)
         LA    R5,16
         LA    R8,HEXTABLE
CHR2HEXL EQU   *
         SR    R7,R7
         IC    R7,0(R2)
         SR    R6,R6
         DR    R6,R5
         LA    R9,0(R8,R7)
         MVC   0(1,R4),0(R9)
         LA    R9,0(R8,R6)
         MVC   1(1,R4),0(R9)
         LA    R4,2(R4)
         LA    R2,1(R2)
         BCT   R3,CHR2HEXL
CHR2HEXR EQU   *
         SR    R15,R15
         PR
         LTORG
HEXTABLE DC CL16'0123456789ABCDEF'
         YREGS
         END

Dette program kaldes fra COBOL således:

01 to-be-converted pic x(10).
01 tbc-length pic s9(9) binary.
01 hex-format pic x(20).
...
move length of to-be-converted to tbc-length
call 'CHR2HEX' using to-be-converted tbc-length hex-format

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.

Forrige danske tip        Last tip in english        Tip oversigten