We help IT Professionals succeed at work.

EBCDIC to ASCII conversion

ekc
ekc asked
on
I need a way to convert a text file containing EBCDIC characters to an ASCII equivalent, programmaticly.
Is there a standard way to do this conversion? An API function, library?
Comment
Watch Question

Commented:
look at http://www.tapedisk.com/tdrawfaq.html

it's an API for concerting that stuff.

from the page:

My data is IBM EBCDIC. I need to convert this to ASCII. How can I do this?
TD RAW does not interpret data. But it does let you use the tape like a disk drive. This means the program you currently use to convert EBCDIC to ASCII will work. The file on the tape is the source and the resulting ASCII file must be targeted to the hard drive. The beauty of TD RAW is you can process the file directly from the tape. There is no need to move the file to the hard disk first.
This is true of all data. A image file can be opened and viewed with an image editing program. A database file can be imported into a database program.
How can I use TD RAW with my custom application?
Gain direct tape access using the TD RAW API The TD RAW API lets you read and write data directly to the tape from your own custom application. A Visual Basic and C++ library are supplied with sample code.
The API overcomes the 2.0GB per file limitation. This means you are only limited by tape capcity.

=:= RideOn
UINT FAR PASCAL EBCDICtoASCII   ( HWND       hWnd,
                                            LPSTR      lpszSource,
                                            LPSTR      lpszTarget,
                                            UINT       wSource,
                                            LPWORD     lpwTarget)
{
    UINT    uiIndex;

    /* Create Translation Table */
    STATIC UCHAR EBCDIC_TO_ASCII[] =
            {
0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
0x80, 0x81, 0x82, 0X83, 0x84, 0x0A, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
0x20, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21,
0x26, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0x5D, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
0x2D, 0x2F, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0x7C, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
0xC3, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9,
0xCA, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
0xD1, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xE8, 0xE9, 0xD6, 0xEB, 0xEC, 0xED,
0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
0x5C, 0x9F, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
            };
   
    for (uiIndex= 0; uiIndex < *lpwTarget; uiIndex ++)
        if (uiIndex < wSource)
            lpszTarget[uiIndex]= EBCDIC_TO_ASCII[(UCHAR)*(lpszSource++)];
        else
            lpszTarget[uiIndex]= EBCDIC_TO_ASCII[' '];

          return 0;
}

Hope this helps.  Basically it is a table, which you index with the EBCDIC character and
get the ASCII translation.  Some Chars are duplicated, and some are converted to
white space.  
ekc

Author

Commented:
Thank you both.
The links RideOn sent are ok, but without the concrete and one-step solution to my problem.
speedguns sent the complete solution the easiest way, and that's why he gets the points.
Email me if you want the code that goes the other way.