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: 12372 Topics: 75 Location: San Jose
|
|
Back to top |
|
|
|
|