MVSFORUMS.com Forum Index MVSFORUMS.com
A Community of and for MVS Professionals
 
 FAQFAQ   SearchSearch   Quick Manuals   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

BASE64 decoding utility

 
Post new topic   Reply to topic   printer-friendly view    MVSFORUMS.com Forum Index -> Application Programming
View previous topic :: View next topic  
Author Message
andrew
Beginner


Joined: 18 Dec 2004
Posts: 5
Topics: 2

PostPosted: Thu Jan 06, 2005 6:58 pm    Post subject: BASE64 decoding utility Reply with quote

Hi All,

Does anybody has a routine to decode BASE64 data? It could be in Assembler or COBOL. It is used in an online environment to decode 20 bytes of data encoded by web application.

Searched the web but only found REXX solution or ASM solution working on files.

Thanks.
Back to top
View user's profile Send private message Yahoo Messenger
OSCORP
Beginner


Joined: 15 Oct 2004
Posts: 29
Topics: 8

PostPosted: Fri Jan 07, 2005 7:44 am    Post subject: Reply with quote

Hi andrew,

Have a look at the following link....may be useful for you.

BASE64

Regs
OsCorp
Back to top
View user's profile Send private message
Bithead
Advanced


Joined: 03 Jan 2003
Posts: 550
Topics: 23
Location: Michigan, USA

PostPosted: Fri Jan 07, 2005 2:58 pm    Post subject: Reply with quote

Try this

Code:

 IDENTIFICATION DIVISION.
 PROGRAM-ID.    ******************************************************************
* CONVERT DATA TO ENBASE64 CONTENT-TRANSFER-ENCODING FOR E-MAIL  *
* TRANSFER VIA SMTP GATEWAY. THIS WILL NEGATE ANY PROBLEMS       *
* CAUSED BY EBCDIC-TO-ASCII CONVERSION.                          *
*                                                                *
* ENCRYPTION TECHNIQUE IS AS FOLLOWS:                            *
*                                                                *
* THREE BYTES ARE CONVERTED TO THREE GROUPS OF 8 BITS. THESE     *
* ARE THEN TREATED AS FOUR GROUPS OF 6 BITS WHICH ARE THEN       *
* CONVERTED TO 4 BITS. EACH BIT WILL NOW HAVE A VALUE 0 THRU     *
* 63. CONVERT THESE VALUES USING A STANDARD TABLE.               *
*                                                                *
******************************************************************
*    DATE     *                 MODIFICATIONS                    *
******************************************************************
*             *                                                  *
******************************************************************

 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.
 INPUT-OUTPUT SECTION.
 FILE-CONTROL.

     SELECT INPUT-FILE ASSIGN TO UT-S-INPUT.

     SELECT OUTPUT-FILE ASSIGN TO UT-S-OUTPUT.

 DATA DIVISION.
 FILE SECTION.
 FD  INPUT-FILE
     RECORD CONTAINS 0 CHARACTERS
     RECORDING MODE IS F.
 01  INPUT-RECORD.
     05 IN-RECORD-CHAR          PIC X(01)
                                OCCURS 10 TO 2000 TIMES
                                DEPENDING ON WS-RECORD-LENGTH.

 FD  OUTPUT-FILE
     RECORDING MODE IS F.
 01  OUTPUT-RECORD              PIC X(80).

 WORKING-STORAGE SECTION.
*
* STANDARD ENCODING TABLE
*
 01  WS-CHAR-SET.
     05 FILLER                      PIC X(26)
       VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
     05 FILLER                      PIC X(26)
       VALUE 'abcdefghijklmnopqrstuvwxyz'.
     05 FILLER                      PIC X(12)
       VALUE '0123456789+/'.
 01  TB-CHAR-SET REDEFINES WS-CHAR-SET.
     05 TB-CHAR                     PIC X OCCURS 64 TIMES.

* CHARACTERS GOING INTO THE CONVERSION
 01  WS-CHAR1-I                     PIC X.
 01  WS-CHAR2-I                     PIC X.
 01  WS-CHAR3-I                     PIC X.
* CHARACTERS COMING OUT OF THE CONVERSION
 01  WS-CHAR1-O                     PIC X.
 01  WS-CHAR2-O                     PIC X.
 01  WS-CHAR3-O                     PIC X.
 01  WS-CHAR4-O                     PIC X.
* BITS GOING INTO THE CONVERSION
 01  WS-BIT-GP1-I                   PIC X(08).
 01  WS-BIT-GP2-I                   PIC X(08).
 01  WS-BIT-GP3-I                   PIC X(08).
* BITS COMING OUT OF THE CONVERSION
 01  WS-BIT-GP1-O                   PIC X(08).
 01  WS-BIT-GP2-O                   PIC X(08).
 01  WS-BIT-GP3-O                   PIC X(08).
 01  WS-BIT-GP4-O                   PIC X(08).

* CONVERT CHARACTER TO BINARY VALUE
 01  WS-CONVERSION-AREA.
     05 WS-CONV-CHAR-DATA.
         10 WS-CONV-CHAR-A          PIC X(01)  VALUE LOW-VALUES.
         10 WS-CONV-CHAR-B          PIC X(01).

     05 WS-CONV-COMP-VALUE REDEFINES WS-CONV-CHAR-DATA
                                    PIC 9(04)  COMP.

 01  WS-INPUT-RECORD                PIC X(2000).

 01  WS-OUTPUT-RECORD               PIC X(80)  VALUE SPACES.

 01  WS-RECORD-LENGTH               PIC S9(04) COMP.

 01  MISC.
     05  SUB1                           PIC S9(04) COMP SYNC.
     05  SUB2                           PIC S9(04) COMP SYNC.
     05  SUB3                           PIC S9(04) COMP SYNC.
     05  SW-EOF-INPUT                   PIC X(01)  VALUE 'N'.
         88 EOF-INPUT                              VALUE 'Y'.
     05  SW-CHAR2-IS-EOF                PIC X(01)  VALUE 'N'.
         88 CHAR2-IS-EOF                           VALUE 'Y'.
     05  SW-CHAR3-IS-EOF                PIC X(01)  VALUE 'N'.
         88 CHAR3-IS-EOF                           VALUE 'Y'.

 LINKAGE SECTION.
 01  LK-PARMS.
     05 FILLER                      PIC S9(04) COMP.
     05 LK-FILE-LENGTH              PIC 9(04).

 PROCEDURE DIVISION USING LK-PARMS.
****************************************************************
*                                                              *
****************************************************************

     PERFORM 1000-INITIALIZE.

     PERFORM 2000-TRANSLATE
         UNTIL EOF-INPUT.

     PERFORM 9000-TERMINATE.

     GOBACK.

 1000-INITIALIZE.
****************************************************************
*                                                              *
****************************************************************

     MOVE LK-FILE-LENGTH              TO WS-RECORD-LENGTH.

     OPEN INPUT  INPUT-FILE
          OUTPUT OUTPUT-FILE.

     PERFORM 8000-READ-INPUT.

     MOVE 1                           TO SUB1
                                         SUB2.

 2000-TRANSLATE.
****************************************************************
*                                                              *
****************************************************************

* STORE CHARACTER 1
     MOVE WS-INPUT-RECORD (SUB1:1)     TO WS-CHAR1-I.
     ADD +1                            TO SUB1.
     IF SUB1 > WS-RECORD-LENGTH
         PERFORM 8000-READ-INPUT
         MOVE +1                       TO SUB1
     END-IF.

* STORE CHARACTER 2
     IF EOF-INPUT
         MOVE LOW-VALUES               TO WS-CHAR2-I
         SET CHAR2-IS-EOF              TO TRUE
     ELSE
         MOVE WS-INPUT-RECORD (SUB1:1) TO WS-CHAR2-I
         ADD +1                        TO SUB1
         IF SUB1 > WS-RECORD-LENGTH
             PERFORM 8000-READ-INPUT
             MOVE +1                   TO SUB1
         END-IF
     END-IF.

* STORE CHARACTER 3
     IF EOF-INPUT
         MOVE LOW-VALUES               TO WS-CHAR3-I
         SET CHAR3-IS-EOF              TO TRUE
     ELSE
         MOVE WS-INPUT-RECORD (SUB1:1) TO WS-CHAR3-I
         ADD +1                        TO SUB1
         IF SUB1 > WS-RECORD-LENGTH
             PERFORM 8000-READ-INPUT
             MOVE +1                   TO SUB1
         END-IF
     END-IF.

* CONVERT EACH CHARACTER (1 BYTE) TO 8 BYTE REPRESENTATION
     MOVE LOW-VALUES                   TO WS-BIT-GP1-I
                                          WS-BIT-GP2-I
                                          WS-BIT-GP3-I.

     CALL 'BITBYTE' USING WS-CHAR1-I WS-BIT-GP1-I.
     CALL 'BITBYTE' USING WS-CHAR2-I WS-BIT-GP2-I.
     CALL 'BITBYTE' USING WS-CHAR3-I WS-BIT-GP3-I.

     MOVE '0'                          TO WS-BIT-GP1-O
                                          WS-BIT-GP2-O
                                          WS-BIT-GP3-O
                                          WS-BIT-GP4-O.

* MOVE EACH GROUP OF 6 TO THE NEW BYTE REPRESENTATION
     MOVE WS-BIT-GP1-I (1:6)           TO WS-BIT-GP1-O (3:6).
     MOVE WS-BIT-GP1-I (7:2)           TO WS-BIT-GP2-O (3:2).
     MOVE WS-BIT-GP2-I (1:4)           TO WS-BIT-GP2-O (5:4).
     MOVE WS-BIT-GP2-I (5:4)           TO WS-BIT-GP3-O (3:4).
     MOVE WS-BIT-GP3-I (1:2)           TO WS-BIT-GP3-O (7:2).
     MOVE WS-BIT-GP3-I (3:6)           TO WS-BIT-GP4-O (3:6).

* CONVERT BACK TO CHARACTERS
     CALL 'BYTEBIT' USING WS-BIT-GP1-O WS-CHAR1-O.
     CALL 'BYTEBIT' USING WS-BIT-GP2-O WS-CHAR2-O.
     CALL 'BYTEBIT' USING WS-BIT-GP3-O WS-CHAR3-O.
     CALL 'BYTEBIT' USING WS-BIT-GP4-O WS-CHAR4-O.

* CONVERT CHARACTERS TO BINARY VALUE AND USE THAT TO DO
* TABLE LOOKUP
     MOVE WS-CHAR1-O            TO WS-CONV-CHAR-B.
     ADD WS-CONV-COMP-VALUE 1 GIVING SUB3.
     MOVE TB-CHAR (SUB3)        TO WS-OUTPUT-RECORD (SUB2:1).
     ADD +1                     TO SUB2.
     IF SUB2 > +76
         PERFORM 8100-WRITE-OUTPUT
         MOVE SPACES            TO WS-OUTPUT-RECORD
         MOVE +1                TO SUB2
     END-IF.

     MOVE WS-CHAR2-O            TO WS-CONV-CHAR-B.
     ADD WS-CONV-COMP-VALUE +1 GIVING SUB3.
     MOVE TB-CHAR (SUB3)        TO WS-OUTPUT-RECORD (SUB2:1).
     ADD +1                     TO SUB2.
     IF SUB2 > +76
         PERFORM 8100-WRITE-OUTPUT
         MOVE SPACES            TO WS-OUTPUT-RECORD
         MOVE +1                TO SUB2
     END-IF.

     MOVE WS-CHAR3-O            TO WS-CONV-CHAR-B.
     ADD WS-CONV-COMP-VALUE +1 GIVING SUB3.
     IF CHAR2-IS-EOF
         MOVE '='               TO WS-OUTPUT-RECORD (SUB2:1)
     ELSE
         MOVE TB-CHAR (SUB3)    TO WS-OUTPUT-RECORD (SUB2:1)
     END-IF.
     ADD +1                     TO SUB2.
     IF SUB2 > +76
         PERFORM 8100-WRITE-OUTPUT
         MOVE SPACES            TO WS-OUTPUT-RECORD
         MOVE +1                TO SUB2
     END-IF.

     MOVE WS-CHAR4-O            TO WS-CONV-CHAR-B.
     ADD WS-CONV-COMP-VALUE +1 GIVING SUB3.
     IF CHAR2-IS-EOF
         MOVE '='               TO WS-OUTPUT-RECORD (SUB2:1)
     ELSE
         MOVE TB-CHAR (SUB3)    TO WS-OUTPUT-RECORD (SUB2:1)
     END-IF.
     ADD +1                     TO SUB2.
     IF SUB2 > +76
         PERFORM 8100-WRITE-OUTPUT
         MOVE SPACES            TO WS-OUTPUT-RECORD
         MOVE +1                TO SUB2
     END-IF.

 8000-READ-INPUT.
****************************************************************
*                                                              *
****************************************************************

     READ INPUT-FILE
       AT END
         SET EOF-INPUT TO TRUE
     END-READ.

     IF EOF-INPUT
         CONTINUE
     ELSE
         MOVE INPUT-RECORD      TO WS-INPUT-RECORD
     END-IF.

 8100-WRITE-OUTPUT.
****************************************************************
*                                                              *
****************************************************************

     WRITE OUTPUT-RECORD         FROM WS-OUTPUT-RECORD.

 9000-TERMINATE.
****************************************************************
*                                                              *
****************************************************************

     MOVE '='                   TO WS-OUTPUT-RECORD (SUB2:1).
     PERFORM 8100-WRITE-OUTPUT.

     MOVE SPACES                TO WS-OUTPUT-RECORD.
     PERFORM 8100-WRITE-OUTPUT.

     CLOSE INPUT-FILE
           OUTPUT-FILE.


Back to top
View user's profile Send private message
andrew
Beginner


Joined: 18 Dec 2004
Posts: 5
Topics: 2

PostPosted: Sat Jan 08, 2005 11:11 am    Post subject: Reply with quote

Thanks OsCorp and BitHead

What is routine "BYTEBIT"? Is it just a simple routine to turn one byte to string of zero and one?

Thanks again BitHead. I will try it out.
Back to top
View user's profile Send private message Yahoo Messenger
Bithead
Advanced


Joined: 03 Jan 2003
Posts: 550
Topics: 23
Location: Michigan, USA

PostPosted: Mon Jan 10, 2005 8:48 am    Post subject: Reply with quote

Sorry Andrew, I did not remember that they were in there. This was converted from a REXX that took too long to run. BITBYTE explodes a BYTE into 8 bytes and BYTEBIT does the opposite. I also see that you needed a decoding routine and all I had was an encoding routine, so you will have to re-work it backwards.
Back to top
View user's profile Send private message
andrew
Beginner


Joined: 18 Dec 2004
Posts: 5
Topics: 2

PostPosted: Wed Jan 12, 2005 7:37 am    Post subject: Reply with quote

Bithead, although your code is not exactly what I need, it give me confidence to write the code. Thanks Bithead. I made it which is pretty short.
Back to top
View user's profile Send private message Yahoo Messenger
coolman
Intermediate


Joined: 03 Jan 2003
Posts: 283
Topics: 27
Location: US

PostPosted: Tue Jan 18, 2005 11:43 am    Post subject: Reply with quote

Bithead,

Code:

SELECT INPUT-FILE ASSIGN TO UT-S-INPUT


I have seen this at "UT-S-" prefix at many places. Do you have any manual link that actually tells what it means.

Cheers,
Coolman.
________
oxygen vaporizer


Last edited by coolman on Sat Feb 05, 2011 1:39 am; edited 1 time in total
Back to top
View user's profile Send private message
Bithead
Advanced


Joined: 03 Jan 2003
Posts: 550
Topics: 23
Location: Michigan, USA

PostPosted: Tue Jan 18, 2005 11:45 am    Post subject: Reply with quote

Sequential file. It is just old code but it is still supported by the compilers.
Back to top
View user's profile Send private message
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12372
Topics: 75
Location: San Jose

PostPosted: Tue Jan 18, 2005 11:49 am    Post subject: Reply with quote

Coolman,

Check this link which explains in detail about the select clause

http://www.mvsforums.com/helpboards/viewtopic.php?t=1541&highlight=unit+transfer

Hope this helps...

Cheers

Kolusu
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic   printer-friendly view    MVSFORUMS.com Forum Index -> Application Programming All times are GMT - 5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


MVSFORUMS
Powered by phpBB © 2001, 2005 phpBB Group