我正在尝试从下面的 C# 代码中的字符串 dataFromClient 中删除所有 CRLF 字符。到目前为止,以下所有尝试均已失败,非常感谢您的帮助:
编辑: 问题是,无论何时调用 Console.WriteLine(dataFromClient) 方法,都会打印字符串,但看起来像这样:"\vposition?:X\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0.....”我希望输出仅为“position?:X”。但是无法从字符串中删除“\0”。
这段代码是我第一次尝试设置一个简单的服务器来接受来自第三方软件的连接。客户端发出请求,然后该服务器将请求解析为电动笛卡尔平台可以理解的命令。
下面是来自控制台应用程序的服务器部分/类的代码。
带有我已经尝试过的建议的帖子:
Removing carriage return and new-line from the end of a string in c#
Serial communication and CRLF C#
How to WriteAllLines in C# without CRLF
Remove a character from a string
String Trim Spaces doesn't work
代码如下:
using System;
using System.Net;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace autotile_V001
{
public class Myserver
{
int MyServerPort;
bool go = true;
int requestCount = 0;
string dataFromClient;
string serverResponse;
IPAddress ipAddr = IPAddress.Loopback;
public string process(string s)
{
int len = s.Length;
int current = 0;
StringBuilder sb = new StringBuilder(len);
while (current < len - 1)
{
if ((s[current] == ' ' && s[current + 1] == ' '))
{
break;
}
else
{
sb.Append(s[current]);
}
current++;
}
return sb.ToString();
}
public void StartMyServer()
{
TcpListener serverSocket = new TcpListener(ipAddr, MyServerPort);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine(" >> Server Started");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine(" >> Accepted connection from client");
requestCount = 0;
while ((go))
{
try
{
requestCount++;
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[(int)clientSocket.ReceiveBufferSize];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
Console.WriteLine(" >> Data from client - {0}", (String.Join("\n", dataFromClient)).Trim());
serverResponse = Console.ReadLine();
Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
Console.WriteLine(" >> " + serverResponse);
go = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
go = false;
}
}
}
public Myserver(int someData)
{
MyServerPort = someData;
}
}
}
最佳答案
Trim()
只是删除前导和尾随空格 - 而不是字符串中的空格。
您需要使用 Replace
从字符串中删除不需要的字符或字符串。在上述情况下,字节流中的任何试用非空白字符(可能不可见,例如 0x0
)将导致对 Trim
的调用不起作用。
var someString = "FOO\r\n\r\n\0";
var strippedTrim = someString.Trim(); // Fail - "FOO\r\n\r\n\0"
var strippedReplace = someString.Replace("\r\n", ""); // "FOO\0"
// .Replace() any other unwanted white space, e.g. "\t"
但是请注意,Trim()
仍会删除尾随的裸 '\n'(与 Windows CRLF
相对),因此它不是String.Join("\n"
导致错误。
编辑
只是为了澄清 string.Join
- string.Join
在单个字符串上使用时是多余的/没有效果(它也不将字符串视为数组单个字符串)。
var join = string.Join("x", "FOO\r\n\r\n").Trim(); // Works - "FOO"
关于c# - 无法从 C# 中的字符串中删除 CRLF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27086300/