C# 如何从网络流字符串中删除提到的字符
我正在使用TcpClient从网页进行telnetC# 如何从网络流字符串中删除提到的字符,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) {
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