Have you ever had the requirement to sum hexadecimal values in a file, which are actually alpha-numeric values (e.g. displayed as 'C6AEA155' )?
This document describes how to translate 8 digits hex values to decimal numeric values and summarize them.
Easytrieve Report Generator, release 11.6
Compile and execute the following CA Easytrieve source:
...
//SYSIN DD *
FILE FILEA
XIN 1 8 A
XIN-BYTE XIN 1 A OCCURS 8 INDEX(IDX)
*
FILE HEXTRAN TABLE INSTREAM
ARG 1 1 A
DESC 4 12 N
A 000000000010
B 000000000011
C 000000000012
D 000000000013
E 000000000014
F 000000000015
0 000000000000
1 000000000001
2 000000000002
3 000000000003
4 000000000004
5 000000000005
6 000000000006
7 000000000007
8 000000000008
9 000000000009
ENDTABLE
*
NUM12 S 12 N VALUE 0
SUMNUM S 12 N VALUE 0
*
JOB INPUT FILEA
IDX = 0
DO WHILE IDX < 8
IDX = IDX + 1
SEARCH HEXTRAN WITH XIN-BYTE(IDX), GIVING NUM12
CASE IDX
WHEN 7
NUM12 = NUM12 * 16
WHEN 6
NUM12 = NUM12 * 256
WHEN 5
NUM12 = NUM12 * 4096
WHEN 4
NUM12 = NUM12 * 65536
WHEN 3
NUM12 = NUM12 * 1048576
WHEN 2
NUM12 = NUM12 * 16777216
WHEN 1
NUM12 = NUM12 * 268435456
END-CASE
SUMNUM = SUMNUM + NUM12
END-DO
DISPLAY 'SUMNUM: ' SUMNUM
/*
...
Short explanation of the source above:
- <!--[endif]-->The JOB activity is reading the records from FILEA - one by one.
- <!--[endif]-->Using the OCCURS with INDEX makes it possible to read Byte by Byte from the XIN field. This is being done in the "DO WHILE IDX < 8" loop.
- <!--[endif]-->The "SEARCH HEXTRAN WITH XIN-BYTE(IDX), GIVING NUM12" instruction is searching for the XIN-BYTE in the HEXTRAN translation table, column 1, and writes the matching decimal value to NUM12.
- <!--[endif]-->Then the CASE - END-CASE statement group is calculating the appropriate power of 16.
This is FILEA input DD used in the example:
...
//FILEA DD *
C6AEA155
0043D11C
...
And this is the expected result when using these two input records:
SUMNUM: 003333333333
SUMNUM: 003337777777
because
X'C6AEA155' = 3333333333
and
X'0043D11C' = 4444444