Avatar billede Christian_Vibe Nybegynder
14. november 2009 - 22:49 Der er 6 kommentarer

Base64 konvertering

Hej eksperter

Er der nogen der kender en rutine til at konvertere base64 tekst til plain txt (læs læsbart format) på en mainframe.

Pl1 kode eller cobol eller db2 funktion på z/os ?

Med venlig hilsen
Christian Vibe
Avatar billede arne_v Ekspert
15. november 2009 - 04:55 #1
Nu er jeg jævnt dårlig til COBOL, men jeg kender base64.

Prøv og se om du kan shine det her lidt op:

IDENTIFICATION DIVISION.
PROGRAM-ID. B64DECODE.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(1) BINARY.
01 L2 PIC 9(3) BINARY.
01 ARRAYS.
    03 B6 PIC 9(3) BINARY OCCURS 4.
    03 B8 PIC 9(3) BINARY OCCURS 3.
LINKAGE SECTION.
01 S PIC X(100) DISPLAY.
01 RES PIC X(100) DISPLAY.
01 L PIC 9(3) BINARY.

PROCEDURE DIVISION USING S, RES, L.
MAIN-PARAGRAPH.
    MOVE 0 TO L
    PERFORM VARYING L2 FROM 1 BY 4 UNTIL S(L2:1) = " "
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
            MOVE FUNCTION ORD(S(-1+L2+I:1)) TO B6(I)
            SUBTRACT 1 FROM B6(I)
        END-PERFORM
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
            IF B6(I) >= 48 AND B6(I) <= 57 THEN
                COMPUTE B6(I) = B6(I) + 4
            ELSE IF B6(I) >= 65 AND B6(I) <= 90 THEN
                COMPUTE B6(I) = B6(I) - 65
            ELSE IF B6(I) >= 97 AND B6(I) <= 122 THEN
                COMPUTE B6(I) = B6(I) - 71
            ELSE IF B6(I) = 43 THEN
                COMPUTE B6(I) = 62
            ELSE IF B6(I) = 47 THEN
                COMPUTE B6(I) = 63
            ELSE IF B6(I) = 61 THEN
                COMPUTE B6(I) = 0
            END-IF
            END-IF
            END-IF
            END-IF
            END-IF
            END-IF
        END-PERFORM
        COMPUTE B8(1) = B6(1) * 4 + B6(2) / 16
        COMPUTE B8(2) = FUNCTION MOD(B6(2), 16) * 16 + B6(3) / 4
        COMPUTE B8(3) = FUNCTION MOD(B6(3), 4) * 64 + B6(4)
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
            ADD 1 TO B8(I)
            MOVE FUNCTION CHAR(B8(I)) TO RES(L+I:1)
        END-PERFORM
        ADD 3 TO L GIVING L
    END-PERFORM
    EXIT PROGRAM.
Avatar billede arne_v Ekspert
15. november 2009 - 04:56 #2
Det er testet med Digital Cobol på VMS.

Men jeg vil tro at det kan porteres til IBM COBOL på z/OS uden det helt store besvær.
Avatar billede arne_v Ekspert
16. november 2009 - 14:49 #3
Ups. Der er lige en lille fejl.

Der skal traekkes antal = til sidst i input fra L ellers faar man trailing zero bytes.

Jeg laver lige en ny version senere.
Avatar billede arne_v Ekspert
17. november 2009 - 02:43 #4
IDENTIFICATION DIVISION.
PROGRAM-ID. B64DECODE.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(1) BINARY.
01 L2 PIC 9(3) BINARY.
01 EQ PIC 9(1) BINARY.
01 ARRAYS.
    03 B6 PIC 9(3) BINARY OCCURS 4.
    03 B8 PIC 9(3) BINARY OCCURS 3.
LINKAGE SECTION.
01 S PIC X(100) DISPLAY.
01 RES PIC X(100) DISPLAY.
01 L PIC 9(3) BINARY.

PROCEDURE DIVISION USING S, RES, L.
MAIN-PARAGRAPH.
    MOVE 0 TO L
    PERFORM VARYING L2 FROM 1 BY 4 UNTIL S(L2:1) = " "
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
            MOVE FUNCTION ORD(S(-1+L2+I:1)) TO B6(I)
            SUBTRACT 1 FROM B6(I)
        END-PERFORM
        MOVE 0 TO EQ
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
            IF B6(I) >= 48 AND B6(I) <= 57 THEN
                COMPUTE B6(I) = B6(I) + 4
            ELSE IF B6(I) >= 65 AND B6(I) <= 90 THEN
                COMPUTE B6(I) = B6(I) - 65
            ELSE IF B6(I) >= 97 AND B6(I) <= 122 THEN
                COMPUTE B6(I) = B6(I) - 71
            ELSE IF B6(I) = 43 THEN
                COMPUTE B6(I) = 62
            ELSE IF B6(I) = 47 THEN
                COMPUTE B6(I) = 63
            ELSE IF B6(I) = 61 THEN
                COMPUTE B6(I) = 0
                ADD 1 TO EQ
            END-IF
            END-IF
            END-IF
            END-IF
            END-IF
            END-IF
        END-PERFORM
        COMPUTE B8(1) = B6(1) * 4 + B6(2) / 16
        COMPUTE B8(2) = FUNCTION MOD(B6(2), 16) * 16 + B6(3) / 4
        COMPUTE B8(3) = FUNCTION MOD(B6(3), 4) * 64 + B6(4)
        PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
            ADD 1 TO B8(I)
            MOVE FUNCTION CHAR(B8(I)) TO RES(L+I:1)
        END-PERFORM
        ADD 3 TO L GIVING L
    END-PERFORM
    SUBTRACT EQ FROM L
    EXIT PROGRAM.
Avatar billede arne_v Ekspert
04. december 2009 - 20:37 #5
OK ?
Avatar billede arne_v Ekspert
14. december 2009 - 03:18 #6
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester