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