【问题标题】:Converting TN5250 Encoding in C#在 C# 中转换 TN5250 编码
【发布时间】:2015-07-31 03:56:01
【问题描述】:

我与 IBM i(AS/400)建立了连接,该连接通过称为 TN5250 的协议/编码进行通信。我无法将它与任何编码 listed here 匹配;如何将此文本转换为我可以使用的内容? UTF8、ASCII; Windows 友好文本格式的任何内容都可以。不得涉及购买第三方库。

这是我在其他地方找到的一些“工作”代码。 “地址”是一个 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 等终端程序不会写入标准输出。

【问题讨论】:

    标签: c# encoding ibm-midrange mainframe


    【解决方案1】:

    TN5250J 项目是一个用 Java 编写的工作 TN5250 客户端。

    TN5250 是基于 Telnet 的 IBM 协议。它适用于 IBM 中端“哑”绿屏终端系列。该系列是块模式,意味着主机在一次传输中向客户端发送完整的显示面板,而客户端在一次传输中将完整的显示面板发送回主机。这与逐个字符的传输相反。

    作为一个非常高级的概述,5250 协议描述了如何格式化显示(开始/停止字段、下划线和颜色等字段属性)以及可接受的功能键。客户端需要了解这些格式化指令才能正确呈现来自主机的数据。同样,客户端不会发回包括常量和格式在内的完整显示面板;相反,它会发回可输入的字段。

    本身没有标准输出;人类可读的显示面板需要客户端渲染。通过使用 Wireshark 捕获数据包并将它们与显示相同事务的实际 TN5250 显示器进行比较,您可能会很好地了解原始数据。

    【讨论】:

      【解决方案2】:

      来自this的文章,看起来编码方案是EBCDIC character-encoding scheme。

      有关转换详情,请参阅How to convert between ASCII and EBCDIC character codes。它在 VB 中,但您应该能够将其转换为 C#。 John Skeet 的页面here也有一个实现@

      How to convert from EBCDIC to ASCII in C#。从这篇文章中,您似乎可以使用您提供的列表中的37 IBM037 IBM EBCDIC (US-Canada) 编码:Encoding ebcdic = Encoding.GetEncoding("IBM037");

      【讨论】:

      • 不,我已经尝试了所有的 EBCDIC 编码。除非我必须在两者之间转换为其他内容才能获得常规文本?
      【解决方案3】:

      TN 5250 不是编码。这是一个高度复杂的协议。

      规范可以在这里找到: http://www.ietf.org/rfc/rfc1205.txt (请注意,此规范甚至不完整)

      没有简单的转换。您必须编写数千行代码或使用已经存在的项目,例如用于 Linux 和 Windows 的 C++ 中的这个项目: http://sourceforge.net/projects/tn5250/files/

      我没有在 C# 中找到任何东西

      【讨论】:

        猜你喜欢
        • 2013-09-01
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多