| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| andrew Beginner
 
 
 Joined: 18 Dec 2004
 Posts: 5
 Topics: 2
 
 
 | 
			
				|  Posted: Thu Jan 06, 2005 6:58 pm    Post subject: BASE64 decoding utility |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| OSCORP Beginner
 
 
 Joined: 15 Oct 2004
 Posts: 29
 Topics: 8
 
 
 | 
			
				|  Posted: Fri Jan 07, 2005 7:44 am    Post subject: |   |  
				| 
 |  
				| Hi andrew, 
 Have a look at the following link....may be useful for you.
 
 BASE64
 
 Regs
 OsCorp
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Bithead Advanced
 
  
 Joined: 03 Jan 2003
 Posts: 550
 Topics: 23
 Location: Michigan, USA
 
 | 
			
				|  Posted: Fri Jan 07, 2005 2:58 pm    Post subject: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| andrew Beginner
 
 
 Joined: 18 Dec 2004
 Posts: 5
 Topics: 2
 
 
 | 
			
				|  Posted: Sat Jan 08, 2005 11:11 am    Post subject: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| Bithead Advanced
 
  
 Joined: 03 Jan 2003
 Posts: 550
 Topics: 23
 Location: Michigan, USA
 
 | 
			
				|  Posted: Mon Jan 10, 2005 8:48 am    Post subject: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| andrew Beginner
 
 
 Joined: 18 Dec 2004
 Posts: 5
 Topics: 2
 
 
 | 
			
				|  Posted: Wed Jan 12, 2005 7:37 am    Post subject: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| coolman Intermediate
 
 
 Joined: 03 Jan 2003
 Posts: 283
 Topics: 27
 Location: US
 
 | 
			
				|  Posted: Tue Jan 18, 2005 11:43 am    Post subject: |   |  
				| 
 |  
				| 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 |  | 
	
		|  | 
	
		| Bithead Advanced
 
  
 Joined: 03 Jan 2003
 Posts: 550
 Topics: 23
 Location: Michigan, USA
 
 | 
			
				|  Posted: Tue Jan 18, 2005 11:45 am    Post subject: |   |  
				| 
 |  
				| Sequential file. It is just old code but it is still supported by the compilers. |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| kolusu Site Admin
 
  
 
 Joined: 26 Nov 2002
 Posts: 12394
 Topics: 75
 Location: San Jose
 
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		|  | 
	
		|  |