Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Cobol routine to convert TEXT to displayable HEX

4,104 views
Skip to first unread message

Donald Johnson

unread,
Jun 9, 2010, 4:37:56 PM6/9/10
to
Hi guys and gals!

Does anyone have a routine (COBOL preferable) that converts a standard text
field into its HEX values?

For example, if I have a field 'BEFORE,' I want to be able to translate it
to
CCCDDC
256695

or to C2C5C6D6D9C5.

My ultimate goal is the first choice (vertical format), but I can deal with
either. I will code this in my COBOL program, so that is why COBOL...I can
do it in other places easily, but I am trying to create a model program that
is self contained.

Thanks in advance!
* Don *

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to list...@bama.ua.edu with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html

Starr, Alan

unread,
Jun 9, 2010, 4:47:54 PM6/9/10
to

Hardee, Charles H

unread,
Jun 9, 2010, 5:01:37 PM6/9/10
to
Hi Don,

01 WK-NDX PIC S9(04) COMP.
01 WK-ZONE PIC S9(04) COMP.
01 WK-DIGIT PIC S9(04) COMP.
01 TEXT-LENGTH PIC S9(04) COMP.
01 TEXT-FIELD.
05 TEXT-CHAR PIC X(01)
OCCURS DEPENDING ON TEXT-LENGTH.
01 TEXT-CONVERTER.
05 FILLER PIC X(01) VALUE LOW-VALUES.
05 TEXT-TO-CNVT PIC X(01).
01 NUMERIC-TEXT REDEFINES TEXT-CONVERTER
PIC S9(04) COMP.

01 CONVERTED-TEXT.
05 CONVERTED-CHARS
OCCURS TEXT-LENGTH TIMES.
10 CONVERTED-ZONE PIC X(01).
10 CONVERTED-DIGIT PIC X(01).

01 HEX-CHARACTERS PIC X(16) VALUE '0123456789ABCDEF'.
01 HEX-CHARS REDEFINES HEX-CHARACTERS.
05 HEX-CHAR OCCURS 16 TIMES
PIC X(01).

MOVE 6 TO TEXT-LENGTH.
MOVE 'BEFORE' TO TEXT-FIELD.
MOVE 1 TO WK-NDX.
PERFORM CONVERT-TEXT 5 TIMES.
CONVERT-TEXT.
MOVE TEXT-CHAR (WK-NDX)
TO TEXT-TO-CNVT.
DIVIDE NUMERIC-TEXT BY 16
GIVING WK-ZONE
REMAINDER WK-DIGIT.
MOVE HEX-CHAR(WK-ZONE)
TO CONVERTED-ZONE (WK-NDX).
MOVE HEX-CHAR(WK-DIGIT)
TO CONVERTED-DIGIT (WK-NDX).
CONVERT-TEXT-END.
MOVE CONVERTED-TEXT
TO anywhere-you want-to-move-it.

Does this work for you?

Chuck

Charles Hardee
CA technologies
Sr Sustaining Engineer
Tel:  +1-952-838-1039
Charles...@ca.com

-----Original Message-----
From: IBM Mainframe Discussion List [mailto:IBM-...@bama.ua.edu] On Behalf Of Donald Johnson
Sent: Wednesday, June 09, 2010 3:37 PM
To: IBM-...@bama.ua.edu
Subject: Cobol routine to convert TEXT to displayable HEX

Charles Hottel

unread,
Jun 9, 2010, 10:18:43 PM6/9/10
to
ID DIVISION.
PROGRAM-ID. HEX.
AUTHOR. CHARLIE HOTTEL.
DATE-WRITTEN. JUL 01, 2002.
DATE-COMPILED.
****************************************************************
* *
* CONVERT BINARY TO PRINTABLE HEX *
* *
****************************************************************
ENVIRONMENT DIVISION.
/
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.

*******01 HEXNUM PIC X(04) VALUE X'0000CA84'.
*******01 HEXNUM PIC X(04) VALUE Z'ABC'.
01 HEXNUM PIC X(04) VALUE z'abc'.
01 DECNUM REDEFINES HEXNUM PIC S9(8) COMP.
01 HEXVAL PIC X(08).
01 HEXSTR PIC X(16) VALUE '0123456789ABCDEF'.
01 DEC PIC S9(04) COMP.
01 FILLER REDEFINES DEC.
05 FILLER PIC X.
05 DECBYTE PIC X.
01 I PIC S9(8) COMP.
01 J PIC S9(8) COMP.
01 Q PIC S9(8) COMP.
01 R PIC S9(8) COMP.
01 J1 PIC S9(8) COMP.
01 Q1 PIC S9(8) COMP.
01 R1 PIC S9(8) COMP.
/
PROCEDURE DIVISION.

0000-MAIN-ROUTINE.
DISPLAY 'Hex ' HEXNUM.
DISPLAY 'Dec ' DECNUM.
PERFORM 0100-CONVERT.
DISPLAY 'Printable ' HEXVAL.
DISPLAY ' '.
DISPLAY HEXVAL(1:1) HEXVAL(3:1) HEXVAL(5:1) HEXVAL(7:1).
DISPLAY HEXVAL(2:1) HEXVAL(4:1) HEXVAL(6:1) HEXVAL(8:1).
GOBACK.
/
0100-CONVERT.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
COMPUTE J = 2 * I - 1
MOVE HEXNUM(I:1) TO DECBYTE
DIVIDE DEC BY 16 GIVING Q REMAINDER R
COMPUTE J1 = J + 1
COMPUTE Q1 = Q + 1
COMPUTE R1 = R + 1
MOVE HEXSTR(Q1:1) TO HEXVAL(J:1)
MOVE HEXSTR(R1:1) TO HEXVAL(J1:1)
END-PERFORM.

"Donald Johnson" <dej...@GMAIL.COM> wrote in message
news:AANLkTim2-2yXPstDNZjwy...@mail.gmail.com...

Andy Robertson

unread,
Jun 10, 2010, 5:22:50 AM6/10/10
to
IDENTIFICATION DIVISION.

PROGRAM-ID. CONVHEX.

* MODULE TO CONVERT CHARS TO HEX
*
* MODIFICATION HISTORY:
*

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.


01 CHARS-POINTER PIC S9(8) COMP.

01 HEX-POINTER PIC S9(8) COMP.

01 TAB-INDX.
04 TAB-IND PIC S9(8) COMP.

01 TAB.
04 T0 PIC X(32) VALUE '000102030405060708090A0B0C0D0E0F'.
04 T1 PIC X(32) VALUE '101112131415161718191A1B1C1D1E1F'.
04 T2 PIC X(32) VALUE '202122232425262728292A2B2C2D2E2F'.
04 T3 PIC X(32) VALUE '303132333435363738393A3B3C3D3E3F'.
04 T4 PIC X(32) VALUE '404142434445464748494A4B4C4D4E4F'.
04 T5 PIC X(32) VALUE '505152535455565758595A5B5C5D5E5F'.
04 T6 PIC X(32) VALUE '606162636465666768696A6B6C6D6E6F'.
04 T7 PIC X(32) VALUE '707172737475767778797A7B7C7D7E7F'.
04 T8 PIC X(32) VALUE '808182838485868788898A8B8C8D8E8F'.
04 T9 PIC X(32) VALUE '909192939495969798999A9B9C9D9E9F'.
04 TA PIC X(32) VALUE 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF'.
04 TB PIC X(32) VALUE 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF'.
04 TC PIC X(32) VALUE 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF'.
04 TD PIC X(32) VALUE 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF'.
04 TE PIC X(32) VALUE 'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF'.
04 TF PIC X(32) VALUE 'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF'.




LINKAGE SECTION.

01 CHARS PIC X(100000).

01 HEX PIC X(200000).

01 LEN PIC S9(8) COMP.


PROCEDURE DIVISION USING CHARS HEX LEN.


MOVE 'N' TO HEX(1:1)

IF LEN NOT > 0 GOBACK END-IF

MOVE 1 TO CHARS-POINTER
MOVE 1 TO HEX-POINTER

PERFORM UNTIL CHARS-POINTER > LEN


MOVE 0 TO TAB-IND
MOVE CHARS(CHARS-POINTER:1) TO TAB-INDX(4:1)
COMPUTE TAB-IND = (TAB-IND * 2) + 1
MOVE TAB(TAB-IND:2) TO HEX(HEX-POINTER:2)
ADD 1 TO CHARS-POINTER
ADD 2 TO HEX-POINTER


END-PERFORM

GOBACK.

http://www.thenightland.co.uk/MYWEB/mvsxmitmail.html

Ddownload it, and look for

~~~~~~~~~~~~ Andy Robertson telephone mobile 0777 214 9545 home 01308 420797

-----IBM Mainframe Discussion List <IBM-...@bama.ua.edu> wrote: -----


To: IBM-...@bama.ua.edu
From: Donald Johnson <dej...@GMAIL.COM>
Sent by: IBM Mainframe Discussion List <IBM-...@bama.ua.edu>
Date: 06/09/2010 09:36PM


Subject: Cobol routine to convert TEXT to displayable HEX

Hi guys and gals!

or to C2C5C6D6D9C5.

**********************************************************************
This email is confidential and may contain copyright material of the John Lewis Partnership.
If you are not the intended recipient, please notify us immediately and delete all copies of this message.
(Please note that it is your responsibility to scan this message for viruses). Email to and from the
John Lewis Partnership is automatically monitored for operational and lawful business reasons.
**********************************************************************

John Lewis plc
Registered in England 233462
Registered office 171 Victoria Street London SW1E 5NN

Websites: http://www.johnlewis.com
http://www.waitrose.com
http://www.greenbee.com
http://www.johnlewispartnership.co.uk

**********************************************************************

Donald Johnson

unread,
Jun 11, 2010, 4:08:53 PM6/11/10
to
Thanks for these choices. I will check through them to see which might fit
better in my needs. You guys are the best!
* Don *

> From: Donald Johnson <dej...@GMAIL.COM <http://gmail.com/>>

Donald Johnson

unread,
Jun 15, 2010, 1:47:10 PM6/15/10
to
Well, here is what I decided to use. I broke my text field into 100-byte
segments (based on report requirements), and converted them into a vertical
alignment (like issuing the HEX ISPF command) and kept it within the program
for simplicity.

Here is the code snippet (working-storage section fields (other than the
input text), and the Procedure statements:
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -7-+
* CONVERT TEXT TO HEX WORK FIELDS
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -7-+
05 WS-TXT-SUB PIC S9(04) VALUE ZERO COMP.
05 WS-ZON-SUB PIC S9(04) VALUE ZERO COMP.
05 WS-DIG-SUB PIC S9(04) VALUE ZERO COMP.
05 WS-CONV-BYTE-NUM.
10 FILLER PIC X(01) VALUE LOW-VALUES.
10 WS-CONV-BYTE PIC X(01).
05 WS-CONV-NUM REDEFINES WS-CONV-BYTE-NUM
PIC 9(04) COMP.
05 WS-CONV-ZONE PIC X(100) VALUE SPACE.
05 WS-CONV-DIGT PIC X(100) VALUE SPACE.
05 WS-HEX-CHARS PIC X(16) VALUE '0123456789ABCDEF'.
05 FILLER REDEFINES WS-HEX-CHARS.
10 WS-X PIC X(01) OCCURS 16 TIMES.

* CONVERT TEXT TO HEX FROM DETAIL LINE DATA

INITIALIZE WS-CONV-ZONES
WS-CONV-DIGTS
PERFORM VARYING WS-TXT-SUB FROM 1 BY 1
UNTIL WS-TXT-SUB GREATER 100
MOVE <<SOURCE FIELD>> (WS-TXT-SUB : 1) TO WS-CONV-BYTE
COMPUTE WS-DIVIDE-RESULT = WS-CONV-NUM / 16
COMPUTE WS-REMAINDER = WS-REMAINDER * 16
COMPUTE WS-ZON-SUB = WS-QUOTIENT
COMPUTE WS-DIG-SUB =
WS-REMAINDER

MOVE WS-X(WS-ZON-SUB + 1) TO WS-CONV-ZONE(WS-TXT-SUB:1)
MOVE WS-X(WS-DIG-SUB + 1) TO WS-CONV-DIGT(WS-TXT-SUB:1)
END-PERFORM.

An alternate to the four COMPUTE statements is:
COMPUTE WS-ZON-SUB =
FUNCTION INTEGER-PART (WS-CONV-NUM / 16)
COMPUTE WS-DIG-SUB =
FUNCTION REM (WS-CONV-NUM 16)

Howvever, multiple runs of a test program running between 100,000 and
1,000,000 iterations of a process to convert all 256 possibilities showed
the FUNCTION calls took between 25 and 30% more TCB time, while they used
virtually the same amount of memory.

I hope others can benefit from this and can use this process.

Thanks to all for your help!

WalterR

unread,
Jun 15, 2010, 9:52:02 PM6/15/10
to
Since COBOL was (only) preferable, maybe a PL/I example would be useful
too.

DCL STR CHAR(13);
DCL HEXV CHAR(99)VAR;
DCL # BIN(31)FIXED;

STR = 'IBM MAIN LIST'; PUT SKIP DATA(STR);
HEXV = HEX2(STR); /* top line concatenated left of bottom line */
# = LENGTH(HEXV)/2; /* always even */
PUT SKIP LIST(SUBSTR(HEXV,1,#)); /* upper */
PUT SKIP LIST(SUBSTR(HEXV,#+1)); /* lower */

HEX2: /* display hex in double-line (dump) format */
PROCEDURE(STR@) RETURNS(CHAR(99)VAR); /* 99? */
DCL STR@ CHAR(*) NONASGN;
DCL(ADDR,*HEXIMAGE*,LENGTH,STRING)BUILTIN;
DCL HEXIMAGE_STR CHAR(LENGTH(STR@)*2)
,1 HEX_STR(LENGTH(STR@)) DEFINED(HEXIMAGE_STR)
,2 HEX_STR1 CHAR(1)
,2 HEX_STR2 CHAR(1);
HEXIMAGE_STR = *HEXIMAGE*(ADDR(STR@),LENGTH(STR@));
RETURN(STRING(HEX_STR(*).HEX_STR1)|| /* must split afterwards */
STRING(HEX_STR(*).HEX_STR2));
END HEX2;

Result:

STR='IBM MAIN LIST';
CCD4DCCD4DCEE
9240419503923

Walter Rue

Sam123

unread,
Jun 2, 2013, 12:09:34 AM6/2/13
to
I tried Don's code and corrected to suite my requirements.
I just converted 10 character string into hexadecimal using the corrected code. The input field SOURCE-INPUT-FIELD is 10 characters length and the output field WS-CONV-ZONE requires 20character field.

Comments:
---------
* This code takes the SOURCE-FIELD string value
* as 'ehstenf241 and converts into hexadecimal value
* as '65687374656E66323431'. This can be used as a
* procedure to convert ascii string to hex at
* mainframe.

IDENTIFICATION DIVISION.
PROGRAM-ID. ASCHEXCONV.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 WORK-AREA.
05 WS-TXT-SUB PIC S9(04) VALUE ZERO COMP.
05 WS-TXT-SUB-01 PIC S9(04) VALUE ZERO COMP.
05 WS-TXT-SUB-02 PIC S9(04) VALUE ZERO COMP.
05 WS-CONV-BYTE-NUM.
10 FILLER PIC X(01) VALUE LOW-VALUES.
10 WS-CONV-BYTE PIC X(01).
05 WS-CONV-NUM REDEFINES WS-CONV-BYTE-NUM
PIC 9(04) COMP.
05 WS-CONV-ZONE PIC X(20) VALUE SPACE.
05 WS-HEX-CHARS PIC X(16) VALUE '0123456789ABCDEF'.
05 FILLER REDEFINES WS-HEX-CHARS.
10 WS-X PIC X(01) OCCURS 16 TIMES.

01 INPUT-AREA-01.
05 SOURCE-INPUT-FIELD PIC X(10) VALUE 'ehstenf241'.
05 FILLER REDEFINES SOURCE-INPUT-FIELD.
10 SOURCE-FIELD PIC X(01) OCCURS 10 TIMES.

77 WS-QUOTIENT PIC S9(04) VALUE ZERO COMP.
77 WS-REMAINDER PIC S9(04) VALUE ZERO COMP.

01 INPUT-TEXT PIC X(1).

PROCEDURE DIVISION.

INITIALIZE WS-CONV-ZONE.
PERFORM VARYING WS-TXT-SUB FROM 1 BY 1
UNTIL WS-TXT-SUB GREATER 10
MOVE SOURCE-FIELD(WS-TXT-SUB) TO WS-CONV-BYTE
COMPUTE WS-QUOTIENT = WS-CONV-NUM / 16
COMPUTE WS-REMAINDER = WS-CONV-NUM - WS-QUOTIENT * 16
COMPUTE WS-TXT-SUB-01 = (WS-TXT-SUB - 1) * 2 + 1
COMPUTE WS-TXT-SUB-02 = WS-TXT-SUB * 2
MOVE WS-X(WS-QUOTIENT + 1) TO WS-CONV-ZONE(WS-TXT-SUB-01:1)
MOVE WS-X(WS-REMAINDER + 1) TO WS-CONV-ZONE(WS-TXT-SUB-02:1)
END-PERFORM.

DISPLAY 'HEXADECIMAL =' WS-CONV-ZONE.

* Below answer is displayed at console.
* 'HEXADECIMAL =65687374656E66323431'

ACCEPT INPUT-TEXT FROM CONSOLE.

* Hit any key and ENTER to exit console

GOBACK.

END PROGRAM ASCHEXCONV.
0 new messages