2010-12-28 2 views
2

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

Теперь, когда я пытаюсь скомпилировать это на C# и пытаюсь дать строку EBCDIC (полученную из другого файла с другого компьютера), он отображает исключение «Вне привязки» для некоторого символа 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; 
    } 
+1

Если вы могли бы разместить код, который выполняет преобразование базирование на массиве мы могли бы попытаться получить больше информации о вашей проблеме. –

+0

опубликовали весь код. Спасибо – aiw

+0

Откуда у вас таблица EBCDIC-ASCII? – dan04

ответ

6

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

+0

Большое спасибо за помощь. Кажется, это проблема. – aiw

+0

Пожалуйста, отметьте мой ответ как ответ, если это поможет вам. Благодарю. –

+0

Юникод-символы не являются 2-байтовыми. Они 21-битные (или 20,1-битные, если хотите), и имеют много представлений. Я думаю, вы хотели сказать, что C# «символы» - это действительно кодовые единицы UTF-16. –

2

Непонятно, что вы делаете, поскольку все, что вы разместили, это массив.

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

2
string convertFromEBCDICtoASCII(string inputEBCDICString, ...) 

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

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

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

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

1

Это, как я сделал это

#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 
Смежные вопросы