EBCDIC <--> ASCII conversion

Jeff Beard jeffb at blia.BLI.COM
Wed Oct 3 08:29:17 AEST 1990


dd conv=ebcdic is in error for some codes, and is why dd also supplies
   conv=ibm.  However, this too is in error frequently due to
   ambiguities in the EBCDIC table(s) ... it depends on which table you
   read and how one needs to map the ASCII to EBCDIC set difference.

The following two tables will allow you to define your own translation.

/* This routine contains only the two tables needed to convert
   ASCII to EBCDIC  and   EBCDIC to ASCII.
   The conversion is according to BTL character set standards.
 
   There are some anomolies in a one/one mapping:
        not all characters are in both charater sets
           eg: PL/1 not       '~'
               ascii karot    '^'
               tidle          '~'
        not all devices can display all characters in the set
           eg: square braces  '[]'
               brackets       '{}'
 
   we accept ASCII data in a 1/1 mapping
 
   we translate EBCDIC ~ to ASCII ~
 
   Table used to convert ascii to ebcdic. ~
*/
 
static char dummy[] = {0};  /* for EOF index */
char atoe[] = {
   0x00          , 0x01          , 0x02          , 0x03          ,
   0x37          , 0x2d          , 0x2e          , 0x2f          ,
   0x16          , 0x05          , 0x25          , 0x0b          ,
   0x0c          , 0x0d          , 0x0e          , 0x0f          ,
   0x10          , 0x11          , 0x12          , 0x13          ,
   0x3c          , 0x3d          , 0x32          , 0x26          ,
   0x18          , 0x19          , 0x1a          , 0x27          ,
   0x1c          , 0x1d          , 0x1e          , 0x1f          ,
   0x40 /* ' ' */, 0x5a /* '!' */, 0x7f /* '"' */, 0x7b /* '#' */,
   0x5b /* '$' */, 0x6c /* '%' */, 0x50 /* '&' */, 0x7d /* ''' */,
   0x4d /* '(' */, 0x5d /* ')' */, 0x5c /* '*' */, 0x4e /* '+' */,
   0x6b /* ',' */, 0x60 /* '-' */, 0x4b /* '.' */, 0x61 /* '/' */,
   0xf0 /* '0' */, 0xf1 /* '1' */, 0xf2 /* '2' */, 0xf3 /* '3' */,
   0xf4 /* '4' */, 0xf5 /* '5' */, 0xf6 /* '6' */, 0xf7 /* '7' */,
   0xf8 /* '8' */, 0xf9 /* '9' */, 0x7a /* ':' */, 0x5e /* ';' */,
   0x4c /* '<' */, 0x7e /* '=' */, 0x6e /* '>' */, 0x6f /* '?' */,
   0x7c /* ']' */, 0xc1 /* 'A' */, 0xc2 /* 'B' */, 0xc3 /* 'C' */,
   0xc4 /* 'D' */, 0xc5 /* 'E' */, 0xc6 /* 'F' */, 0xc7 /* 'G' */,
   0xc8 /* 'H' */, 0xc9 /* 'I' */, 0xd1 /* 'J' */, 0xd2 /* 'K' */,
   0xd3 /* 'L' */, 0xd4 /* 'M' */, 0xd5 /* 'N' */, 0xd6 /* 'O' */,
   0xd7 /* 'P' */, 0xd8 /* 'Q' */, 0xd9 /* 'R' */, 0xe2 /* 'S' */,
   0xe3 /* 'T' */, 0xe4 /* 'U' */, 0xe5 /* 'V' */, 0xe6 /* 'W' */,
   0xe7 /* 'X' */, 0xe8 /* 'Y' */, 0xe9 /* 'Z' */, 0xad /* '[' */,
   0xe0 /* '\' */, 0xbd /* ']' */, 0x9a /* '^' */, 0x6d /* '_' */,
   0x79 /* '`' */, 0x81 /* 'a' */, 0x82 /* 'b' */, 0x83 /* 'c' */,
   0x84 /* 'd' */, 0x85 /* 'e' */, 0x86 /* 'f' */, 0x87 /* 'g' */,
   0x88 /* 'h' */, 0x89 /* 'i' */, 0x91 /* 'j' */, 0x92 /* 'k' */,
   0x93 /* 'l' */, 0x94 /* 'm' */, 0x95 /* 'n' */, 0x96 /* 'o' */,
   0x97 /* 'p' */, 0x98 /* 'q' */, 0x99 /* 'r' */, 0xa2 /* 's' */,
   0xa3 /* 't' */, 0xa4 /* 'u' */, 0xa5 /* 'v' */, 0xa6 /* 'w' */,
   0xa7 /* 'x' */, 0xa8 /* 'y' */, 0xa9 /* 'z' */, 0xc0 /* '{' */,
   0x4f /* '|' */, 0xd0 /* '}' */, 0xa1 /* '~' */, 0x07          ,
   0x04          , 0x06          , 0x08          , 0x09          ,
   0x0a          , 0x14          , 0x15          , 0x17          ,
   0x1b          , 0x20          , 0x21          , 0x22          ,
   0x23          , 0x24          , 0x28          , 0x29          ,
   0x2a          , 0x2b          , 0x2c          , 0x30          ,
   0x31          , 0x33          , 0x34          , 0x35          ,
   0x36          , 0x38          , 0x39          , 0x3a          ,
   0x3b          , 0x3e          , 0x3f          , 0x41          ,
   0x42          , 0x43          , 0x44          , 0x45          ,
   0x46          , 0x47          , 0x48          , 0x49          ,
   0x4a          , 0x51          , 0x52          , 0x53          ,
   0x54          , 0x55          , 0x56          , 0x57          ,
   0x58          , 0x59          , 0x62          , 0x63          ,
   0x64          , 0x65          , 0x66          , 0x67          ,
   0x68          , 0x69          , 0x6a          , 0x70          ,
   0x71          , 0x72          , 0x73          , 0x74          ,
   0x75          , 0x76          , 0x77          , 0x78          ,
   0x80          , 0x8a          , 0x8b          , 0x8c          ,
   0x8d          , 0x8e          , 0x8f          , 0x90          ,
   0x9b          , 0x9c          , 0x9d          , 0x9e          ,
   0x9f          , 0xa0          , 0xa1          , 0xaa          ,
   0xab          , 0xac          , 0xae          , 0xaf          ,
   0xb0          , 0xb1          , 0xb2          , 0xb3          ,
   0xb4          , 0xb5          , 0xb6          , 0xb7          ,
   0xb8          , 0xb9          , 0xba          , 0xbb          ,
   0xbC          , 0xbe          , 0xbf          , 0xca          ,
   0xcb          , 0xcc          , 0xcd          , 0xce          ,
   0xcf          , 0xda          , 0xdb          , 0xdc          ,
   0xdd          , 0xde          , 0xdf          , 0xe1          ,
   0xea          , 0xeb          , 0xec          , 0xed          ,
   0xee          , 0xef          , 0xfa          , 0xfb          ,
   0xfc          , 0xfd          , 0xfe          , 0xff          ,
   };
 
 
 
   /* Table used to convert ebcdic to ascii.
   */
 
static char dummy2[] = {0};  /* for EOF index */
char etoa[] = {
  /*  0               1               2               3           */
   0000          , 0001          , 0002          , 0003          ,
   0200          , 0011          , 0201          , 0177          ,
   0202          , 0203          , 0204          , 0013          ,
   0014          , 0015          , 0016          , 0017          ,
   0020          , 0021          , 0022          , 0023          ,
   0205          , 0206          , 0010          , 0207          ,
   0030          , 0031          , 0032          , 0210          ,
   0034          , 0035          , 0036          , 0037          ,
   0211          , 0212          , 0213          , 0214          ,
   0215          , 0012          , 0027          , 0033          ,
   0216          , 0217          , 0220          , 0221          ,
   0222          , 0005          , 0006          , 0007          ,
   0223          , 0224          , 0026          , 0225          ,
   0226          , 0227          , 0230          , 0004          ,
   0231          , 0232          , 0233          , 0234          ,
   0024          , 0025          , 0235          , 0236          ,
   0040 /* ' ' */, 0237          , 0240          , 0241          ,
   0242          , 0243          , 0244          , 0245          ,
   0246          , 0247          , 0250          , 0056 /* '.' */,
   0074 /* '<' */, 0050 /* '(' */, 0053 /* '+' */, 0174 /* '|' */,
   0046 /* '&' */, 0251          , 0252          , 0253          ,
   0254          , 0255          , 0256          , 0257          ,
   0260          , 0261          , 0041 /* '!' */, 0044 /* '$' */,
   0052 /* '*' */, 0051 /* ')' */, 0073 /* ';' */, 0176 /* '~' */,
   0055 /* '-' */, 0057 /* '/' */, 0262          , 0263          ,
   0264          , 0265          , 0266          , 0267          ,
   0270          , 0271          , 0272          , 0054 /* ',' */,
   0045 /* '%' */, 0137 /* '_' */, 0076 /* '>' */, 0077 /* '?' */,
   0273          , 0274          , 0275          , 0276          ,
   0277          , 0300          , 0301          , 0302          ,
   0303          , 0140 /* '`' */, 0072 /* ':' */, 0043 /* '#' */,
   0100 /* '@' */, 0047 /* ''' */, 0075 /* '=' */, 0042 /* '"' */,
   0304          , 0141 /* 'a' */, 0142 /* 'b' */, 0143 /* 'c' */,
   0144 /* 'd' */, 0145 /* 'e' */, 0146 /* 'f' */, 0147 /* 'g' */,
   0150 /* 'h' */, 0151 /* 'i' */, 0305          , 0306          ,
   0307          , 0310          , 0311          , 0312          ,
   0313          , 0152 /* 'j' */, 0153 /* 'k' */, 0154 /* 'l' */,
   0155 /* 'm' */, 0156 /* 'n' */, 0157 /* 'o' */, 0160 /* 'p' */,
   0161 /* 'q' */, 0162 /* 'r' */, 0136 /* '^' */, 0314          ,
   0315          , 0316          , 0317          , 0320          ,
#ifdef OLDC
   0321          , 0322 /*  ~  */, 0163 /* 's' */, 0164 /* 't' */,
#else  OLDC
   0321          , 0176 /*  ~  */, 0163 /* 's' */, 0164 /* 't' */,
#endif OLDC
   0165 /* 'u' */, 0166 /* 'v' */, 0167 /* 'w' */, 0170 /* 'x' */,
   0171 /* 'y' */, 0172 /* 'z' */, 0323          , 0324          ,
   0325          , 0133 /* '[' */, 0326          , 0327          ,
   0330          , 0331          , 0332          , 0333          ,
   0334          , 0335          , 0336          , 0337          ,
   0340          , 0341          , 0342          , 0343          ,
   0344          , 0135 /* ']' */, 0345          , 0346          ,
   0173 /* '{' */, 0101 /* 'A' */, 0102 /* 'B' */, 0103 /* 'C' */,
   0104 /* 'D' */, 0105 /* 'E' */, 0106 /* 'F' */, 0107 /* 'G' */,
   0110 /* 'H' */, 0111 /* 'I' */, 0347          , 0350          ,
   0351          , 0352          , 0353          , 0354          ,
   0175 /* '}' */, 0112 /* 'J' */, 0113 /* 'K' */, 0114 /* 'L' */,
   0115 /* 'M' */, 0116 /* 'N' */, 0117 /* 'O' */, 0120 /* 'P' */,
   0121 /* 'Q' */, 0122 /* 'R' */, 0355          , 0356          ,
   0357          , 0360          , 0361          , 0362          ,
   0134 /* '\' */, 0363          , 0123 /* 'S' */, 0124 /* 'T' */,
   0125 /* 'U' */, 0126 /* 'V' */, 0127 /* 'W' */, 0130 /* 'X' */,
   0131 /* 'Y' */, 0132 /* 'Z' */, 0364          , 0365          ,
   0366          , 0367          , 0370          , 0371          ,
   0060 /* '0' */, 0061 /* '1' */, 0062 /* '2' */, 0063 /* '3' */,
   0064 /* '4' */, 0065 /* '5' */, 0066 /* '6' */, 0067 /* '7' */,
   0070 /* '8' */, 0071 /* '9' */, 0372          , 0373          ,
   0374          , 0375          , 0376          , 0377          ,
   };



More information about the Comp.lang.c mailing list