C#如何读取\r\n字符串

C#如何读取\r\n字符串,c#,xml,serial-port,C#,Xml,Serial Port,首先,你好!,这是我的第一篇帖子 我正在编写一个应用程序来读取和写入串行端口,一切都很好,但是因为在我的公司,我们有不同类型的扫描仪,它们配置了不同的前缀/后缀字符,大多数都有\r\n序列 所以我决定在xml配置文件中包含这个后缀,如下所示: <rPortSuffix>\r\n</rPortSuffix> 问题是,当文本值传递给srPortSuffix时,变量存储的不是“\r\n”,而是“\\r\\n”,因此当我尝试读取串行端口时,由于后缀字符串不正确(对于换行常量),

首先,你好!,这是我的第一篇帖子

我正在编写一个应用程序来读取和写入串行端口,一切都很好,但是因为在我的公司,我们有不同类型的扫描仪,它们配置了不同的前缀/后缀字符,大多数都有\r\n序列

所以我决定在xml配置文件中包含这个后缀,如下所示:

<rPortSuffix>\r\n</rPortSuffix>
问题是,当文本值传递给srPortSuffix时,变量存储的不是“\r\n”,而是“\\r\\n”,因此当我尝试读取串行端口时,由于后缀字符串不正确(对于换行常量),不会发生任何事情

所以我试着:

srPortSuffix= Regex.Replace(srPortSuffix, @"\\", @"\"); 
但是没有成功。有什么建议吗

TL;博士

如何使从xml文件读取的“\r\n”值与此完全相同,而不是“\\r\\n”

编辑:

正如Jirka Hanika所建议的,我只是将字符串从“\r\n”更改为ascii码,如下所示:

<rPortSuffix>&#13;&#10;</rPortSuffix>


现在我的应用程序正在为我正在测试的两种扫描仪工作


谢谢

您可能会混淆实际字符串数据与它们在C#源代码中的表示方式。当然,C#语法不适用于XML文件,因此
\r\n
与换行符序列没有任何关系

您显示的代码不会将其转换为
\\r\\n
,但也不会将其转换为换行符序列

实现后者的最简单方法是:

srPortSuffix = srPortSuffix.Replace(@"\r", "\r").Replace(@"\n", "\n");
基本上你会做一些C编译器通常为你做的事情,但完全不在任何C源代码范围内

还有一种更简单的选择,即不转换任何内容,直接将换行符序列放入XML文件:

<rPortSuffix>
</rPortSuffix>

然而,这可能会被一些读者误解和/或打破您漂亮的打印惯例(结束标记不会缩进)。用XML编写相同内容的一种更脏但可能更实用的方法:

<rPortSuffix>&#13;&#10;</rPortSuffix>



我认为你的方法有点误解
\r\n
可以说是一个“符号”,它按顺序指示回车和新行。这个“符号”(或一组)只对编译器有效——它们对其他任何东西都没有意义,甚至对运行时代码也没有意义

编译器所做的是在编译时将它们转换为二进制表示形式。所以,当你这么做的时候

var str = "\r\n";
编译器实际上存储了如下内容:

{ 0xD, 0xA } 
(这里并不意味着字符串是数组……我不知道字符串是如何存储在.Net中的,您也不应该这样做)

因此,编译器正在将您的“代码”解释并转换为其他内容。我的观点是,既然你要把编译器从等式中去掉(通过在运行时读取值),你就必须完成它的工作

因此,根据这一原理,我将阅读配置文件的内容,然后“解释”它:

当然,由于这些都是代表性的,我认为更好的方法是使用其他一些表达来代表新的路线。您的配置可以读取:

<rPortSuffix>CarriageReturn-NewLine</rPortSuffix>

您可以存储新行字符的ASCII代码,并将其解析为代码中的实际字符。只是个主意。stringbuilder有用吗?可能是StringBuilder.AppendLine();?本质上是将数据保存到stringBuilder的变量中,并在每一行追加\r\n?该值可能是
\r\n
,但当您在调试器中查看该变量时,它将对其进行转义。不过,当程序运行时,它不会停止该序列,因此不能仅限于此。我正试图通过ASCII码识别身份。这很有效!我现在正尝试使用ASCII码,因为这听起来是一种更好的方法。@desto-我添加了一种方法,该方法也依赖于ASCII码,并且不要求您将代码更改为答案。对不起,我看到并实现了它,但忘了在这里回复,这一个可以像其他扫描器一样使用其他字符,这样我就可以覆盖所有字符。
{ 0xD, 0xA } 
if (srPortSuffix == "\\\\r\\\\n")
{
    actualPortSuffix = "\r\n";
}
<rPortSuffix>CarriageReturn-NewLine</rPortSuffix>
if (srPortSuffix == "CarriageReturn-NewLine")
{
    actualPortSuffix = "\r\n";
}