EBCDIC 到 ASCII 的转换。越界错误。在 C# 中

发布于 2024-10-09 16:01:46 字数 2855 浏览 9 评论 0原文

我尝试使用此一般转换顺序(如下所示)在 C# 中创建 EBCDIC 到 ASCII 转换器。基本上,该程序使用以下顺序从 ASCII 转换为等效整数,然后从那里转换为 EDCDIC。

现在,当我尝试在 C# 中编译此字符串并尝试给出 EBCDIC 字符串(从另一台计算机的另一个文件获取此字符串)时,它显示某些 EBCDIC 字符的“越界”异常。为什么会这样??是不是格式化的问题??还是C#??还是窗户?

额外:我尝试使用 0..255 个数字的循环打印出所有 ASCII 和 EBCDIC 字符,但仍然没有显示许多 EBCDIC 字符。我是否缺少任何标准?

整个代码如下:

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;
    }

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;
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夜唯美灬不弃 2024-10-16 16:01:46

您没有显示生成错误的代码,但如果您使用该字符作为数组的索引,您应该知道 C# 使用 Unicode(2 字节)字符。字符代码可以一直达到 64k。这绝对超出了你的数组的范围。

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.

熊抱啵儿 2024-10-16 16:01:46

完全不清楚你在做什么,因为你发布的只是数组。

不过,我有一个您可能想要使用的 EBCDIC 编码实现。它不能处理“转移”,但它普通System.Text.Encoding类的子类,因此您可以将它与StreamReader之类的东西一起使用。哦,还有各种不同的风格 - 基本上,这个目录中列出了所有内容。您需要找到适合您的那一款。

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.

回眸一遍 2024-10-16 16:01:46
  string convertFromEBCDICtoASCII(string inputEBCDICString, ...)

你一开始就走错了路。您无法将包含 EBCDIC 的文件读取为字符串。 .NET 文本文件阅读器将假设文件中的文本以某种方式进行编码。与 StreamReader 一样,它默认使用 utf-8。这无法在 EBCDIC 文件上正常工作,它会错误解释某些字符并将它们转换为 >= 256 的 Unicode 代码点。这将破坏您的数组索引代码。

您必须将输入参数更改为 byte[]。使用 FileStream 或 File.ReadAllBytes() 读取文件。

下一个问题是您的表对于 .NET 字符串无效,它们以 utf-16 编码。例如,128 不是 ASCII 代码,也不编码有效的 Unicode 代码点。不确定使用什么代码页来构造该表,可能是代码页 1252。替换字节后,接下来必须使用 Encoding.GetString() 将该代码页转换为 Unicode。

要以另一种方式杀死这条恶龙,请注意 Encoding 类已经支持 EBCDIC 代码页。查看 Encoding.GetEncodings() 方法的文档。您必须了解 IBM 代码页。您可以将正确的编码传递给 StreamReader(String, Encoding) 构造函数,而不必编写任何此类代码。

  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.

混浊又暗下来 2024-10-16 16:01:46

我就是这样做的

    #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

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文