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

标签 c# string parsing newline

我正在尝试从下面的 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/

相关文章:

c++ - 将 vector<char> 转换为 const char* 和 string

java - 使用 jSoup 解析 CSS

c# - 以编程方式升级 Visual Studio 解决方案和项目文件

c# - HttpWebRequest 是否自动发送 200 OK?

javascript - 使用 WebSocket 维护连接

c - "Error reading characters of string"C,Visual Studio 2013

c# - 为什么泛型类型推断在那种情况下不起作用?

c++ - 用于 if-else 的字符串和数字用户输入,接收错误

json - 如何解析 Json 中的部分对象

php - DOMDocument::loadHTML(): 由于输入错误导致输入转换失败