Преобразование кодировки TN5250 в C # - PullRequest
1 голос
/ 05 июля 2011

У меня есть соединение с IBM i (AS / 400), которое связывается по протоколу / кодировке TN5250.Я не смог сопоставить его ни с одной из кодировок , перечисленных здесь ;Как я могу преобразовать этот текст в то, что я могу использовать?UTF8, ASCII;все в текстовом формате, дружественном к Windows, подойдет.Это не должно включать покупку сторонней библиотеки.

Вот некоторый «рабочий» код, который я нашел в другом месте.«address» - это IP-адрес.

        Socket SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(IPAddress.Parse("address"), 23);
        SocketClient.Connect(remoteEndPoint);
        byte[] buffer = new byte[10];
        textBox1.Text += Receive(SocketClient, buffer, 0, buffer.Length, 10000).Trim() + "\r\n";
    }
    public static string Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
    {
        int startTickCount = Environment.TickCount;
        int received = 0;  // how many bytes is already received
        do
        {
            if (Environment.TickCount > startTickCount + timeout)
                throw new Exception("Timeout.");
            try
            {
                received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
                return Encoding.GetEncoding(37).GetString(buffer, 0, buffer.Length);
                //byte[] buf = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buffer);
                //return Encoding.GetEncoding("IBM500").GetString(buf, 0, buffer.Length);
            }
            catch (SocketException ex)
            {
                if (ex.SocketErrorCode == SocketError.WouldBlock ||
                    ex.SocketErrorCode == SocketError.IOPending ||
                    ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                {
                    // socket buffer is probably empty, wait and try again
                    Thread.Sleep(30);
                }
                else
                    throw ex;  // any serious error occurr
            }
        } while (received < size);
        return "";
    }

Это соединение Telnet.Работает нормально в окне Windows Telnet.Решение, которое я действительно хочу, - это способ перехватить стандартный вывод из сеанса telnet, но, очевидно, терминальные программы, такие как Telnet, не записывают в стандартный вывод.

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Проект TN5250J - это рабочий клиент TN5250, написанный на Java.

TN5250 - это протокол IBM, который работает поверх Telnet.Он предназначен для семейства «тупых» терминалов зеленого экрана IBM среднего уровня.Это семейство является блочным режимом, то есть хост отправляет полную панель дисплея клиенту за одну передачу, а клиент отправляет полную панель дисплея обратно хосту за одну передачу.Это, в отличие от посимвольной передачи.

В качестве обзора очень высокого уровня протокол 5250 описывает, как форматировать отображение (поле начала / остановки, атрибуты поля, такие как подчеркивание и цвет), а такжеа какие функциональные клавиши приемлемы.Клиент должен понимать эти инструкции по форматированию, чтобы правильно отображать данные, поступающие с хоста.Аналогично, клиент не отправляет обратно всю панель дисплея, включая константы и форматирование;вместо этого он отправляет обратно поля с возможностью ввода.

Нет стандартного вывода как такового;удобочитаемая панель дисплея требует визуализации клиентом.Вы можете лучше понять необработанные данные, используя Wireshark для захвата пакетов и сравнения их с фактическим дисплеем TN5250, показывающим ту же транзакцию.

2 голосов
/ 05 июля 2011

Из этой статьи выглядит схема кодирования EBCDIC character-encoding scheme.

См. Как преобразовать коды символов ASCII в EBCDIC для получения подробной информации о преобразовании.Это в VB, но вы должны быть в состоянии преобразовать его в C #.На странице Джона Скита также есть реализация здесь

Как конвертировать из EBCDIC в ASCII в C # .Из этого поста похоже, что вы можете использовать кодировку 37 IBM037 IBM EBCDIC (US-Canada) из предоставленного вами списка: Encoding ebcdic = Encoding.GetEncoding("IBM037");

0 голосов
/ 30 июля 2015

TN 5250 не является кодировкой. Это очень сложный протокол.

Спецификацию можно найти здесь: http://www.ietf.org/rfc/rfc1205.txt (Обратите внимание, что эта спецификация даже не завершена)

Нет простого преобразования. Вы должны написать тысячи строк кода или использовать уже существующий проект, например, такой как C ++ для Linux и Windows: http://sourceforge.net/projects/tn5250/files/

Я не нашел ничего в C #

...