2011-08-26 6 views
0

ので、このコードsnipit:メモリマップファイルから読み込むときにどのような値を使用しますか? C#

static void Main(string[] args) 
{ 
    Console.WriteLine("Memory mapped file reader started"); 

    using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues")) 
    { 
     using (var reader = file.CreateViewAccessor()) 
     { 

      var bytes = new byte[3388]; 
      var encoding = Encoding.ASCII; 

      XmlDocument document = new XmlDocument(); 
      document.LoadXml("<root>" + encoding.GetString(bytes) + "</root>"); 
      XmlNode node = document.DocumentElement.SelectSingleNode("//value"); 
      Console.WriteLine("node = " + node); 

     } 
    } 

    Console.WriteLine("Press any key to exit ..."); 
    Console.ReadLine(); 
} 

、共有メモリ(snipit)からこのような情報を読み取る:

<sys><id>SCPUCLK</id><label>CPU Clock</label><value>2930</value></sys><sys><id>SCPUMUL</id><label>CPU Multiplier</label><value>11.0</value></sys> 

とは<value></value>はそれを印刷するすべての値を読み出します。 でも正しく動作しません。無効な文字が表示されます。 "例外が発生すると例外が発生します。

私は「新しいバイト[3388];」を変更しようとしました。 <root></root>のない文字列の全長は3388です(それを見つけるためにhdd上のTXTファイルに出力されます)ので、私は13を追加して3401を取得しました(ルートタグがどれくらい長いので、 )

でも、 "'。、16進値0x00は無効な文字です(行1、位置7)。

おかげ

+4

あなたは 'reader'を使用していないようです。 – ChaosPandion

+1

document.LoadXml( "" + encoding.GetString(bytes)+ ""); この行では、バイトデータをどのくらい正確に埋めますか?あなたが示したコードでは、バイトは宣言されていますが、いっぱいになっていませんか? – Zenwalker

+0

なぜこのためにメモリマップファイルが必要ですか? XMLファイルから約3Kバイトを読み込む必要はありません。 –

答えて

1

ので、いくつかの考え:

あなたのエラーが失敗するXMLDocument.LoadXMLにおけるXMLの検証を()引き起こしているあなたのXML文字列内の非印字文字、によって引き起こされます。

返されたMemoryMappedViewAccessorクラス(リーダー)を見ると、それの容量プロパティをチェックしたいと思っています。このプロパティは、読み込める最も遠いものです。 ReadByte()は大丈夫ですが、あなたのデータがASCIIであることを知っていれば、ReadChar()を使用せずにStringBuilderオブジェクトに追加してください。

データ自体に無効な文字が含まれている場合、文字列からこれらの文字を何らかの形で消さずに、読み込みプロセス中に正しく読み込む方法はありません。そのようなシナリオでは、あなたのバッファをファイルにダンプし、そのファイルを「すべての文字を表示」機能を持つNotePad ++のようなツールでロードします。これにより、特定の文字と場所(通常のXMLの外にある場合は、バッファが正しく処理されていないことを示している可能性があります)を具体的に表示することができます。

+0

よく私はファイルに文字列をダンプしたので、実際には文字列に無効な文字がないことはわかっています。わからないけど、ASCIって何?私は入力のサンプルに応じてどのようなエンコードを使用しますか?感謝の言葉 – Csharpz

+0

あなたが使用するエンコーディングはあなたのソースが何であるかに依存します。一般的に、ソースはあなたに伝えます。さもなければ、私はXMLのためにUTF-8を仮定します。 無効な文字がないことを確認するために、あなたは何を使用しましたか?それだけで眼球を動かすことはできません。この方法でテストに合格したら、そのXMLファイルをXMLDocument.Load()を介してテストC#アプリケーションに直接ロードし、問題が再現するかどうかを確認することをお勧めします。 XMLファイルとして読み込んでも問題が再現されない場合は、悪い文字を取り除いているファイルに書き込んでいる可能性があります。 –

+0

ファイルに書き込むことでそれを掃除しているなら、それらの仕組みは、その悪い文字がどこに存在するかの手がかりを提供するかもしれません。 –

関連する問題