EBCDIC to ASCII conversion. Out of bound error. In C#
I tried creating a EBCDIC to ASCII convector in C# using this general conversion order(given below). Basically the program converted from ASCII to the equivalent integer and from there into EDCDIC using the order below.
Now when I try compiling this in C# and try giving a EBCDIC string(got this from another file from another computer) it is showing 'Out of Bound' exception for some of the EBCDIC character. Why is this like this?? Is it about formating?? or C# ?? or windows?
Extra: I tried just printing out all the ASCII and EBCDIC characters using a loop from 0..255 numbers but still its not showing many of the EBCDIC characters. Am I missing any standards?
The whole code is as follows:
public string convertFromEBCDICtoASCII(string inputEBCDICString, int initialPos, int endPos)
{
string inputSubString = inputEBCDICString.Substring(initialPos, endPos);
int[] e2a = new int[256]{
0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15,
16, 17, 18, 19,157,133, 8,135, 24, 25,146,143, 28, 29, 30, 31,
128,129,130,131,132, 10, 23, 27,136,137,138,139,140, 5, 6, 7,
144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26,
32,160,161,162,163,164,165,166,167,168, 91, 46, 60, 40, 43, 33,
38,169,170,171,172,173,174,175,176,177, 93, 36, 42, 41, 59, 94,
45, 47,178,179,180,181,182,183,184,185,124, 44, 37, 95, 62, 63,
186,187,188,189,190,191,192,193,194, 96, 58, 35, 64, 39, 61, 34,
195, 97, 98, 99,100,101,102,103,104,105,196,197,198,199,200,201,
202,106,107,108,109,110,111,112,113,114,203,204,205,206,207,208,
209,126,115,116,117,118,119,120,121,122,210,211,212,213,214,215,
216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,
123, 65, 66, 67, 68, 69, 70, 71, 72, 73,232,233,234,235,236,237,
125, 74, 75, 76, 77, 78, 79, 80, 81, 82,238,239,240,241,242,243,
92,159, 83, 84, 85, 86, 87, 88, 89, 90,244,245,246,247,248,249,
开发者_运维技巧 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,250,251,252,253,254,255
};
char chrItem = Convert.ToChar("0");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < inputSubString.Length; i++)
{
try
{
chrItem = Convert.ToChar(inputSubString.Substring(i, 1));
sb.Append(Convert.ToChar(e2a[(int)chrItem]));
sb.Append((int)chrItem);
sb.Append((int)00);
}
catch (Exception ex)
{
Console.WriteLine("//" + ex.Message);
return string.Empty;
}
}
string result = sb.ToString();
sb = null;
return result;
}
You didn't show your code that generates the error but if you are using the character as the index into the array, you should know that C# uses Unicode (2-byte) characters. The character code could go all the way up to 64k. That would definitely be out of bounds for your array.
It's entirely unclear what you're doing, as all you've posted is the array.
However, I have an EBCDIC encoding implementation you might want to use. It doesn't cope with "shifting" but it is a subclass of the normal System.Text.Encoding
class, so you can use it with things like StreamReader
. Oh, and there are various different flavours - everything listed in this directory, basically. You'll need to find the one that suits you.
string convertFromEBCDICtoASCII(string inputEBCDICString, ...)
You started off on the wrong foot. There is no way that you can read an file that contains EBCDIC into a string. A .NET text file reader is going to assume the text in the file is encoded in some way. Like StreamReader, it will use utf-8 by default. That cannot work properly on a EBCDIC file, it will mis-interpret some of the characters and turn them into Unicode codepoints that are >= 256. Which will then blow up your array indexing code.
You have to change the input argument to byte[]. Read the file with FileStream or File.ReadAllBytes().
The next problem is that your table isn't valid for .NET strings, they are encoded in utf-16. For example, 128 isn't an ASCII code and doesn't encode a valid Unicode code point. Not sure what code page was used to construct the table, code page 1252 perhaps. After replacing the byte, you'd then next have to use Encoding.GetString() to convert that code page to Unicode.
To slay this dragon another way, note that the Encoding class already supports EBCDIC code pages. Review the docs of the Encoding.GetEncodings() method. You'll have to know the IBM code page. You can pass the proper encoding to the StreamReader(String, Encoding) constructor and won't have to write any of this code.
This is how I did it
#region public static byte[] ConvertAsciiToEbcdic(byte[] asciiData)
public static byte[] ConvertAsciiToEbcdic(byte[] asciiData)
{
// Create two different encodings.
Encoding ascii = Encoding.ASCII;
Encoding ebcdic = Encoding.GetEncoding("IBM037");
//Retutn Ebcdic Data
return Encoding.Convert(ascii, ebcdic, asciiData);
}
#endregion
#region public static byte[] ConvertEbcdicToAscii(byte[] ebcdicData)
public static byte[] ConvertEbcdicToAscii(byte[] ebcdicData)
{
// Create two different encodings.
Encoding ascii = Encoding.ASCII;
Encoding ebcdic = Encoding.GetEncoding("IBM037");
//Retutn Ascii Data
return Encoding.Convert(ebcdic, ascii, ebcdicData);
}
#endregion
精彩评论