Преобразование EBCDIC в ASCII. Вне связанной ошибки. В C # - PullRequest
2 голосов
/ 29 декабря 2010

Я попытался создать конвектор EBCDIC в ASCII в C #, используя этот общий порядок преобразования (приведенный ниже). В основном программа конвертируется из ASCII в эквивалентное целое число и оттуда в EDCDIC, используя порядок ниже.

Теперь, когда я пытаюсь скомпилировать это в C # и дать строку EBCDIC (полученную из другого файла с другого компьютера), он показывает исключение «Out of Bound» для некоторых символов EBCDIC. Почему это так ?? Это о форматировании ?? или C # ?? или окна?

Дополнительно: я попытался просто распечатать все символы ASCII и EBCDIC, используя цикл из чисел 0..255, но все равно на нем не отображаются многие символы 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;
    }

Ответы [ 4 ]

6 голосов
/ 29 декабря 2010

Вы не показали свой код, который генерирует ошибку, но если вы используете символ в качестве индекса в массиве, вы должны знать, что C # использует символы Unicode (2-байтовые).Код символа может доходить до 64 КБ.Это определенно будет за пределами вашего массива.

2 голосов
/ 08 февраля 2011

Вот как я это сделал

    #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
2 голосов
/ 29 декабря 2010
  string convertFromEBCDICtoASCII(string inputEBCDICString, ...)

Вы начали не с той ноги.Вы не можете прочитать файл, содержащий EBCDIC, в строку.Программа чтения текстовых файлов .NET предполагает, что текст в файле каким-то образом закодирован.Как и StreamReader, он будет использовать utf-8 по умолчанию.Это не может работать должным образом в файле EBCDIC, оно будет неправильно интерпретировать некоторые символы и превратить их в кодовые точки Unicode, которые> = 256. Что затем взорвет ваш индекс индексации массива.

Вы должны изменитьвходной аргумент для byte [].Прочитайте файл с помощью FileStream или File.ReadAllBytes ().

Следующая проблема заключается в том, что ваша таблица недопустима для строк .NET, они закодированы в utf-16.Например, 128 не является кодом ASCII и не кодирует допустимую кодовую точку Unicode.Не уверен, какая кодовая страница использовалась для построения таблицы, возможно, кодовая страница 1252.После замены байта вам затем придется использовать Encoding.GetString () для преобразования этой кодовой страницы в Unicode.

Чтобы убить этого дракона другим способом, обратите внимание, что класс Encoding уже поддерживает кодовые страницы EBCDIC.Просмотрите документы по методу Encoding.GetEncodings ().Вам нужно знать кодовую страницу IBM.Вы можете передать правильную кодировку конструктору StreamReader (String, Encoding), и вам не придется писать этот код.

2 голосов
/ 29 декабря 2010

Совершенно неясно, что вы делаете, поскольку все, что вы опубликовали, - это массив.

Однако у меня есть реализация кодирования EBCDIC , которую вы, возможно, захотите использовать.Он не справляется с «сдвигом», но является подклассом нормального System.Text.Encoding класса, поэтому вы можете использовать его с такими вещами, как StreamReader.Да, и есть разные вкусы - все, что перечислено в этом каталоге , в основном.Вам нужно будет найти тот, который подходит вам.

...