3

まず、こんにちは!、これが私の最初の投稿です!

シリアルポートの読み取りと書き込みを行うアプリケーションを作成していますが、すべて正常に機能していますが、私の会社ではさまざまな種類のスキャナーを使用しているため、さまざまなプレフィックス/サフィックス文字で構成されており、ほとんどのスキャナーに\ r\nが付いています。順序。

そこで、次のように、このサフィックスをxml構成ファイルに含めることにしました。

<rPortSuffix>\r\n</rPortSuffix>

xmlファイルを読むときは、これを使用します

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

問題は、テキスト値がsrPortSuffixに渡されるときに、「\ r \ n」ではなく、変数に「\\ r \\ n」が格納されるため、シリアルポートを読み取ろうとしても、不正なサフィックス文字列(改行定数の場合)

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

だから私は試しました:

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

しかし、成功しませんでした。任意のヒント?

TL; DR

xmlファイルから読み取った「\r\ n」の値を、「\\ r \\ n」ではなく、そのように正確に読み取るにはどうすればよいですか?

編集:

Jirka Hanikaが提案したように、文字列を「\ r\n」からASCIIコードに変更しただけです。

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

そして今、私のアプリケーションは、私がテストしている2種類のスキャナーで動作しています。

ありがとう!!

4

2 に答える 2

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>
于 2012-08-02T16:33:49.307 に答える
2

あなたのアプローチには少し誤解があると思います。\r\nは、いわば「シンボル」であり、キャリッジリターンと改行を順番に示します。この「シンボル」(またはのグループ)は、コンパイラに対してのみ有効です。これらは、ランタイムコードに対してさえ、他の何に対しても何の意味もありません。

コンパイラが行うことは、コンパイル時にそれらをバイナリ表現に変換することです。だから、あなたがするとき

var str = "\r\n";

コンパイラは実際には次のようなものを格納します。

{ 0xD, 0xA } 

(ここでは、文字列が配列であることを意味していません。..文字列が.Netにどのように格納されているかわかりません。また、そうすべきではありません)

したがって、コンパイラは「コード」を解釈して別のコードに変換しています。ここでの私の意見は、コンパイラーを方程式から外しているので(実行時に値を読み取ることによって)、その仕事をしなければならないということです。

したがって、この理論的根拠に従って、構成ファイルの内容を読み取り、それを「解釈」します。

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

もちろん、これはすべて代表的なものなので、さらに良いアプローチは、新しい線を表すために他の式を使用することだと思います。あなたの設定は読むことができます:

<rPortSuffix>CarriageReturn-NewLine</rPortSuffix>

これははるかに明確です。コードでは、次のようにします。

if (srPortSuffix == "CarriageReturn-NewLine")
{
    actualPortSuffix = "\r\n";
}
于 2012-08-02T16:44:01.557 に答える