无法从 c# 中的字符串中删除 CRLF

本文关键字:字符串 删除 CRLF | 更新日期: 2023-09-27 18:31:46

我正在尝试从以下 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...."我希望输出只有"位置?:X"。但是无法从字符串中修剪"''0"。

这段代码是我第一次尝试设置一个简单的服务器来接受来自第三方软件的连接。请求来自客户端,然后此服务器将请求解析为机动笛卡尔级理解的命令。

波纹管是控制台应用程序的服务器部分/类中的代码。

我已经尝试过的建议帖子:

在 c# 中删除字符串末尾的回车符和换行

串行通信和 CRLF C#

如何在没有 CRLF 的情况下用 C# 编写所有行

从字符串中删除字符

字符串修剪空格不起作用

这是代码:

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;
        }
    }
}

无法从 c# 中的字符串中删除 CRLF

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()仍将删除尾随的裸"'"(与 Windows CRLF 相反),因此它不是导致该错误String.Join("'n"

编辑

只是为了澄清string.Join - string.Join 在单个字符串上使用时是多余的/没有效果的(它也不会将字符串视为单个字符串的数组)。

var join = string.Join("x", "FOO'r'n'r'n").Trim(); // Works - "FOO"