C# 如何从网络流字符串中删除提到的字符

C# 如何从网络流字符串中删除提到的字符,c#,html,webforms,telnet,tcpclient,C#,Html,Webforms,Telnet,Tcpclient,我正在使用TcpClient从网页进行telnet server = new TcpClient(ConfigurationManager.AppSettings["DynamicIP"], Convert.ToInt32(ConfigurationManager.AppSettings["DynamicPort"])); ns = server.GetStream(); 用下面的方法读取流的响应时 if (ns.CanRead) {

我正在使用TcpClient从网页进行telnet

server = new TcpClient(ConfigurationManager.AppSettings["DynamicIP"], Convert.ToInt32(ConfigurationManager.AppSettings["DynamicPort"]));
            ns = server.GetStream();
用下面的方法读取流的响应时

if (ns.CanRead)
        {
            byte[] readBuffer = new byte[1024];
            int numBytesRead = 0;
            do
            {
                numBytesRead = ns.Read(readBuffer, 0, readBuffer.Length);
                // ss= Encoding.GetEncoding(1252).GetString(readBuffer.ToArray());
                //sb.Append(readBuffer[0].ToString);
                sb.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer, 0, numBytesRead));
                sb.Replace(Convert.ToChar(24), ' ');
                sb.Replace(Convert.ToChar(255), ' ');
                sb.Replace('?', ' ');
                //sb.Replace(Environment.NewLine, "<br />").ToString();
            }
            while (ns.DataAvailable);
        }
        // var s = Regex.Replace(sb.ToString(), @"[^\u0000-\u007F]", string.Empty);
        //var s = "<br/>" + sb.ToString();
        //s = s.Normalize(NormalizationForm.FormD);
        //var chars = s.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark).ToArray();
        //return new string(chars).Normalize(NormalizationForm.FormC);
        ////return "<br/>" + s.ToString();
        var dd = "<br/>" + sb.ToString();
        return dd;
if(ns.CanRead)
{
字节[]读缓冲区=新字节[1024];
int numBytesRead=0;
做
{
numBytesRead=ns.Read(readBuffer,0,readBuffer.Length);
//ss=Encoding.GetEncoding(1252).GetString(readBuffer.ToArray());
//sb.Append(readBuffer[0].ToString);
sb.AppendFormat(“{0}”,Encoding.ASCII.GetString(readBuffer,0,numBytesRead));
sb.替换(转换为第(24)款,“”);
sb.替换(转换为ToChar(255),“”);
替换(“?”,“);
//sb.替换(Environment.NewLine,“
”).ToString(); } 而(ns.DataAvailable),; } //var s=Regex.Replace(sb.ToString(),@“[^\u0000-\u007F]”,string.Empty); //var s=“
”+sb.ToString(); //s=s.Normalize(NormalizationForm.FormD); //var chars=s.Where(c=>CharUnicodeInfo.getunicodecegory(c)!=unicodecegory.nonspacemark.ToArray(); //返回新字符串(chars).Normalize(NormalizationForm.FormC); ////返回“
”+s.ToString(); var dd=“
”+sb.ToString(); 返回dd;
但字符串中包含以下字符。如何删除或替换以在web表单中以可读格式显示telnet响应?我试了很多东西,但都没有成功

我想显示在网页上的反应就像腻子阅读的反应

提前谢谢

);40f;9f;40f;9f;40f;2f;40f;4;34f;11f;40f;40f;40f;40f;11f;40f;11f;40f;11f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;40f;11f;11f;11f;40f;40f;40f;40f;40f;4;40f;4;4;4;4;4;4;4;4;4;4;40f;4;4;4;4;4;4;4;40f;4;4;4;4;4;4;40f;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;4;[4;39f;2f[4;34f;9f[4;37f;9f[4;34f;40f[4;37f;40f;9f;40f;40f;40f;40f;9f;9f[4;37f;9f[4;37f;11f[4;37f;9f[4;34f;40f[4;37f;40f][4;37f;40f;9f;40f;2f;40f;9f[4;37f;9f[4;37f;11f[4;37f;11f[4;37f;39f;9f[4;37f;40f;40f;9f;40f;40f;11f;40f;9f;40f;40f;40f;40f;9f[4;34f;2f[4;34f;11f[4;34f;40f;40f[4;34f;40f]


问题是您的telnet服务器假定您支持。因为所有这些字符都是这样的。例如(
表示带有的字符)

[4;34f

是强制光标位置
[{ROW};{COLUMN}f
的ANSI控制序列

您必须说服telnet服务器您不支持ANSI/VT100,或者编写一个可以处理ANSI/VT100控制代码的解析器

现在我做的是后者。一个简单的解析器可能看起来像这样。它除了解析出ANSI/VT100代码之外什么都不做,也不会将这些代码附加到StringBuilder中

var ns = server.GetStream();
// keep state of the parser
bool Ansi = false;
bool AnsiSub = false;
bool InFirstNumber = false;
bool InSecondNumber = false;
string firstnumber = String.Empty;
string secondnumber = String.Empty;

if (ns.CanRead)
{
    // testcase
    // var ms = new MemoryStream(Encoding.ASCII.GetBytes("foo\x1b[123A\x1b[123;456ftest2\x1bKblah\x1b[s"));
    var sr = new StreamReader(ns, Encoding.ASCII);
    while(!sr.EndOfStream)
    {
        var chr = sr.Read();
        switch (chr)
        {
            case 27:
                // escape char means next chars will be ANSI code
                Ansi = true;
                break;
            default:
                if (Ansi)
                {
                    // will this be a single ANSI code char or multiple
                    if (!AnsiSub)
                    {
                        switch ((char)chr)
                        {
                            case '[':
                                // multiple, set state 
                                AnsiSub = true;
                                InFirstNumber = true;
                                InSecondNumber = false;
                                firstnumber = string.Empty;
                                secondnumber = string.Empty;
                                break;
                            default:
                                // handle this char if needed
                                // possible is: 78()DMH
                                Ansi = false;
                                AnsiSub = false;
                                break;
                        }
                    }
                    else
                    {
                        var achar = (char)chr;
                        // number checks and capturing
                        if (Char.IsDigit(achar))
                        {
                            // a bit sloppy
                            if (InFirstNumber)
                            {
                                firstnumber += achar;
                            } 
                            else
                            {
                                // HACK, refactor later
                                if (InSecondNumber)
                                {
                                    secondnumber += achar;
                                }
                            }
                        }
                        else
                        {
                            if (achar == ';')
                            {
                                // number sequence break
                                InSecondNumber = true;
                                InFirstNumber = false;
                            }
                            else
                            {
                                // last char of ANSI code
                                switch (achar)
                                {
                                    case 'A':
                                        // Cursor Up        <ESC>[{COUNT}A
                                        break;
                                    case 'f':
                                        // Force Cursor Position    <ESC>[{ROW};{COLUMN}f
                                        Console.WriteLine("Force cursor row:{0}, col:{1}", firstnumber, secondnumber);
                                        break;
                                }
                                // now we are done, reset state
                                Ansi = false;
                                AnsiSub = false;
                            }
                        }
                    }
                } 
                else
                {
                    // plain character
                    sb.Append((Char)chr);
                }
                break;
        }
    }
var ns=server.GetStream();
//保持解析器的状态
bool-Ansi=false;
bool-AnsiSub=false;
bool InFirstNumber=假;
bool-unsecondnumber=false;
string firstnumber=string.Empty;
string secondnumber=string.Empty;
如果(ns.CanRead)
{
//测试用例
//var ms=new MemoryStream(Encoding.ASCII.GetBytes(“foo\x1b[123A\x1b[123;456ftest2\x1bKblah\x1b[s”);
var sr=新的StreamReader(ns,Encoding.ASCII);
而(!sr.EndOfStream)
{
var chr=sr.Read();
开关(chr)
{
案例27:
//转义字符意味着下一个字符将是ANSI代码
Ansi=真;
打破
违约:
如果(Ansi)
{
//这是单个ANSI代码字符还是多个ANSI代码字符
如果(!AnsiSub)
{
开关((字符)chr)
{
案例“[”:
//多重,设定状态
Anisub=真;
InFirstNumber=true;
编号=假;
firstnumber=string.Empty;
secondnumber=string.Empty;
打破
违约:
//如果需要,请处理此字符
//可能是:78()DMH
Ansi=假;
AnsiSub=假;
打破
}
}
其他的
{
var-achar=(char)chr;
//数字检查和捕获
if(字符IsDigit(achar))
{
//有点马虎
if(InFirstNumber)
{
第一个数+=阿查;
} 
其他的
{
//黑客,稍后重构
如果(不确定编号)
{
第二个数+=achar;
}
}
}
其他的
{
如果(achar==';')
{
//数字序列中断
unsecondnumber=true;
InFirstNumber=假;
}
其他的
{
//ANSI代码的最后一个字符
开关(achar)
{
案例“A”:
//光标向上[{COUNT}A