У меня есть подключение к IBM i (AS/400), которое обменивается данными по протоколу/кодированию под названием TN5250. Мне не удалось сопоставить его ни с одной из кодировок перечислено здесь; как я могу преобразовать этот текст во что-то, что я могу использовать? 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. Решение, которое мне действительно нужно, — это способ захвата stdout из сеанса telnet, но очевидно, что терминальные программы, такие как Telnet, не пишут в stdout.