2012-08-02 82 views
3

首先,嗨!,这是我的第一篇文章!C#如何阅读 r n字符串

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

所以我决定把我的XML配置文件,该后缀,像这样:

<rPortSuffix>\r\n</rPortSuffix> 

当我看到我的XML文件,我用这个

case "rPortSuffix": 
    srPortSuffix = xmlReader.Value; 
break; 

的问题是,当文本值传递给srPortSuffix,而不是“\ r \ n”,变量存储“\\ r \\ n”,所以当我尝试读取串口时,由于不正确的后缀字符串而没有任何反应NewLine常量)

spRead.NewLine = srPortSuffix; //NewLine constant read in XML file 
sReadData = spRead.ReadLine(); //Storing the read data 

所以,我想:

srPortSuffix= Regex.Replace(srPortSuffix, @"\\", @"\"); 

,但没有成功。有小费吗?

TL; DR

我怎样才能让 “\ r \ n” 从XML文件中读取值读取,而不是 “\\ \\ [R N” 完全一样,?

编辑:

正如尔卡Hanika建议,我只是改变了我的字符串从 “\ r \ n” 来的ASCII码,因为这样的:

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

现在我的应用程序是为两种类型的扫描仪工作,我正在测试它。

谢谢!

+0

您可以存储新代码的ASCII码,并将其解析为代码中的实际字符。只是一个想法。 – Justin 2012-08-02 16:27:42

+0

stringbuilder会有用吗?也许StringBuilder.AppendLine();?基本上将你的数据保存到一个stringBuilder的变量中,并在每一行添加\ r \ n? – plast1K 2012-08-02 16:28:21

+3

该值可能是'\ r \ n',但是当您在调试器中查看该变量时,它将会将其转义。 – SwDevMan81 2012-08-02 16:28:44

回答

5

您可能会混淆实际字符串数据与它们在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> 
+0

This Works!我现在试着用ASCII码来做,因为它听起来像是一种更好的方法。 – desto 2012-08-02 16:38:06

+0

@desto - 我添加了一种也依赖于ASCII码的方法,并且不需要您根本将您的代码更改为答案。 – 2012-08-02 16:46:54

+0

对不起,我看到它并实现它,但忘了在这里回复,这个将会像其他扫描仪使用其他字符一样,并以这种方式我可以覆盖它们。 – desto 2012-08-02 17:34:11

2

我认为你的方法有一点误解。 \r\n是一个“符号”,可以这么说,它表示按顺序回车和换行。这个“符号”(或一组)仅对编译器有效 - 对于其他任何内容,甚至对运行时代码都没有任何意义。

编译器在编译时将它们转换为二进制表示。所以,当你做

var str = "\r\n"; 

编译器实际存储是这样的:

{ 0xD, 0xA } 

(这里没有暗示一个字符串是一个数组...我不知道如何将字符串存储英寸净,也不应该)

所以,编译器正在解释和转换你的'代码'到别的东西。我的看法是,由于你正在将编译器带出等式(通过读取运行时的值),你必须完成它的工作。

所以,下面这个理由,我会读取配置文件的内容,然后在“解释”是:

if (srPortSuffix == "\\\\r\\\\n") 
{ 
    actualPortSuffix = "\r\n"; 
} 

当然,因为这是所有代表,我相信会是一个更美好方法是使用其他表达式来表示新行。您的配置可能会显示为:

<rPortSuffix>CarriageReturn-NewLine</rPortSuffix> 

哪一个更清晰。在代码中,你会这样做:

if (srPortSuffix == "CarriageReturn-NewLine") 
{ 
    actualPortSuffix = "\r\n"; 
}