Не удалось удалить CRLF из строки в С#

Я пытаюсь удалить все символы CRLF из строки dataFromClient в коде С# ниже. Все следующие попытки потерпели неудачу, и я был бы очень благодарен за вашу помощь:

edit: Проблема в том, что всякий раз, когда вызывается метод 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" из строки.

Этот код является моей первой попыткой настроить простой сервер, чтобы принять форму подключения стороннего программного обеспечения. Запросы производятся от клиента, затем этот сервер анализирует запрос на команды, которые понимает моторизованная декартова ступень.

Bellow - это код из части сервера/класса консольного приложения.

Сообщения с предложениями, которые я уже пробовал:

Удаление возврата каретки и новой строки из конца строки в С#

Последовательная связь и CRLF С#

Как написатьAllLines в С# без CRLF

Удаление символа из строки

Строки Trim Spaces не работают

Вот код:

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;
 }
 }
}
1 ответ

Trim() просто удаляет ведущие и конечные пробелы, а не пробелы внутри строки.

Вам нужно будет использовать Replace для удаления ненужных символов или строк из строки. В вышеприведенном случае любой пробный символ небелого пробела (который может быть не виден, например 0x0) в потоке байта, приведет к тому, что вызов Trim не будет работать.

var someString = "FOO\r\n\r\n\0";
var strippedTrim = someString.Trim(); // Fail - "FOO\r\n\r\n\0"
var *************** = 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"

licensed under cc by-sa 3.0 with attribution.