/* REXX
|
| Name: Bit2Char
|
| Author: David Alcock
| dalcock@csw.com
|
| Purpose: Given a binary string, show the hex and characters that
| it represents.
|
| When issued on ASCII machines like OS/2 and MSDOS,
| the characters will also be shown in EBCDIC.
|
| Sample Invocation: "BIT2CHAR 1101011011010010"
|
| Results in the output (on MVS/TSO):
|
| Char: OK
| Hex: D6D2
| Bit: 1101011011010010
*/
arg bstr
if bstr == "" then bstr = "1101011011010010" /* Default: OK */
/* Note: I do not check to ensure that binary strings are full
8 byte multiples!!!!! */
bstrn = length(bstr) / 8
loc = 1
xstr = ""
do i = 1 to bstrn
xstr = xstr||b2x(substr(bstr,loc,8)) /* Turn 8 bits into 2 byte hex */
loc = loc + 8
end
nchar = x2c(xstr) /* Convert hex string to Native character */
/*
| ISO 8859-1 to CECP 1047 (Extended de-facto EBCDIC):
*/
toEBCDIC = '00010203372D2E2F1605250B0C0D0E0F'x /* 00 */
toEBCDIC = toEBCDIC||'101112133C3D322618193F271C1D1E1F'x /* 10 */
toEBCDIC = toEBCDIC||'405A7F7B5B6C507D4D5D5C4E6B604B61'x /* 20 */
toEBCDIC = toEBCDIC||'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'x /* 30 */
toEBCDIC = toEBCDIC||'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'x /* 40 */
toEBCDIC = toEBCDIC||'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D'x /* 50 */
toEBCDIC = toEBCDIC||'79818283848586878889919293949596'x /* 60 */
toEBCDIC = toEBCDIC||'979899A2A3A4A5A6A7A8A9C04FD0A107'x /* 70 */
toEBCDIC = toEBCDIC||'202122232415061728292A2B2C090A1B'x /* 80 */
toEBCDIC = toEBCDIC||'30311A333435360838393A3B04143EFF'x /* 90 */
toEBCDIC = toEBCDIC||'41AA4AB19FB26AB5BBB49A8AB0CAAFBC'x /* A0 */
toEBCDIC = toEBCDIC||'908FEAFABEA0B6B39DDA9B8BB7B8B9AB'x /* B0 */
toEBCDIC = toEBCDIC||'6465626663679E687471727378757677'x /* C0 */
toEBCDIC = toEBCDIC||'AC69EDEEEBEFECBF80FDFEFBFCBAAE59'x /* D0 */
toEBCDIC = toEBCDIC||'4445424643479C485451525358555657'x /* E0 */
toEBCDIC = toEBCDIC||'8C49CDCECBCFCCE170DDDEDBDC8D8EDF'x /* F0 */
/*
| CECP 1047 (Extended de-facto EBCDIC) to ISO 8859-1:
*/
toASCII = '000102039C09867F978D8E0B0C0D0E0F'x /* 00 */
toASCII = toASCII||'101112139D8508871819928F1C1D1E1F'x /* 10 */
toASCII = toASCII||'80818283840A171B88898A8B8C050607'x /* 20 */
toASCII = toASCII||'909116939495960498999A9B14159E1A'x /* 30 */
toASCII = toASCII||'20A0E2E4E0E1E3E5E7F1A22E3C282B7C'x /* 40 */
toASCII = toASCII||'26E9EAEBE8EDEEEFECDF21242A293B5E'x /* 50 */
toASCII = toASCII||'2D2FC2C4C0C1C3C5C7D1A62C255F3E3F'x /* 60 */
toASCII = toASCII||'F8C9CACBC8CDCECFCC603A2340273D22'x /* 70 */
toASCII = toASCII||'D8616263646566676869ABBBF0FDFEB1'x /* 80 */
toASCII = toASCII||'B06A6B6C6D6E6F707172AABAE6B8C6A4'x /* 90 */
toASCII = toASCII||'B57E737475767778797AA1BFD05BDEAE'x /* A0 */
toASCII = toASCII||'ACA3A5B7A9A7B6BCBDBEDDA8AF5DB4D7'x /* B0 */
toASCII = toASCII||'7B414243444546474849ADF4F6F2F3F5'x /* C0 */
toASCII = toASCII||'7D4A4B4C4D4E4F505152B9FBFCF9FAFF'x /* D0 */
toASCII = toASCII||'5CF7535455565758595AB2D4D6D2D3D5'x /* E0 */
toASCII = toASCII||'30313233343536373839B3DBDCD9DA9F'x /* F0 */
/*
| Hex table to aid in translating all 8-bit characters
*/
hextable = '000102030405060708090A0B0C0D0E0F'x /* 00 */
hextable = hextable || '101112131415161718191A1B1C1D1E1F'x /* 10 */
hextable = hextable || '202122232425262728292A2B2C2D2E2F'x /* 20 */
hextable = hextable || '303132333435363738393A3B3C3D3E3F'x /* 30 */
hextable = hextable || '404142434445464748494A4B4C4D4E4F'x /* 40 */
hextable = hextable || '505152535455565758595A5B5C5D5E5F'x /* 50 */
hextable = hextable || '606162636465666768696A6B6C6D6E6F'x /* 60 */
hextable = hextable || '707172737475767778797A7B7C7D7E7F'x /* 70 */
hextable = hextable || '808182838485868788898A8B8C8D8E8F'x /* 80 */
hextable = hextable || '909192939495969798999A9B9C9D9E9F'x /* 90 */
hextable = hextable || 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF'x /* A0 */
hextable = hextable || 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF'x /* B0 */
hextable = hextable || 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF'x /* C0 */
hextable = hextable || 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF'x /* D0 */
hextable = hextable || 'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF'x /* E0 */
hextable = hextable || 'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF'x /* F0 */
mtype = address()
select
when mtype == "CMD" then call show_ebcdic /* OS/2 & OREXX */
when mtype == "COMMAND" then call show_ebcdic /* MSDOS? */
when mtype == "TSO" then call show_ascii /* MVS/TSO */
when mtype == "CMS" then call show_ascii /* VM/CMS */
otherwise
say "Char:" nchar
say "Hex: " xstr
say "Bit: " bstr
end /* of "select" */
exit
show_ebcdic:
say "Char:" nchar "(ASCII)"
say "Hex: " xstr
say "Bit: " bstr
say " "
say "CECP 1047 code page (Extended de-facto EBCDIC)" ,
"character translation:"
say "> "translate(x2c(xstr),hextable,toEBCDIC)
return
show_ascii:
say "Char:" nchar "(EBCDIC)"
say "Hex: " xstr
say "Bit: " bstr
say " "
say "ISO 8859-1 code page (ASCII) character translation:"
say "> "translate(x2c(xstr),hextable,toASCII)
return