2011-08-26 132 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(打印到HDT上的TXT文件找出来),所以我加了13,得到了3401(因为那是多长时间的根标签,我不得不添加修复多个根错误)

但我似乎仍然得到关于“'。”的错误,十六进制值0x00,是一个无效的字符,第1行,第7位。

感谢

+4

你似乎没有使用'reader'。 – ChaosPandion

+1

document.LoadXml(“”+ encoding.GetString(bytes)+“”); 在这一行中,您如何填充字节数据?我的意思是在你显示的代码中,字节得到了声明,但是根本没有被填充? – Zenwalker

+0

为什么你需要一个内存映射文件?从XML文件读取约3K字节不应该这样做。 –

回答

1

所以一些想法:

你的错误是由你的XML字符串中的非打印字符,这是造成XMLDocument.LoadXML()的XML验证失败造成的。

查看返回的(读取器)的MemoryMappedViewAccessor类,您希望检查该容器的容量属性,这将是您可以读取的最远的容器属性。 ReadByte()没问题,但是如果你知道你的数据是ASCII,那么为什么不使用ReadChar()并在你转到StringBuilder对象时追加它们?

如果数据本身具有无效字符,则在读取过程中没有办法正确加载它,而不首先以某种方式从字符串中清除这些字符。对于这样的场景,我会将缓冲区转储到文件中,然后使用NotePad ++等具有“显示所有字符”功能的工具加载该文件。这将使您能够具体查看哪些字符和哪里(如果它们不在正常的XML中,这可能表示您仍然没有正确处理缓冲区)。

+0

以及我将字符串转储到一个文件,所以我知道它实际上没有任何字符串中的无效字符。我不确定,什么是ASCI?根据我给出的输入样本,你会使用什么编码? thankls – Csharpz

+0

您使用的编码取决于您的来源。一般来说,源代码应该告诉你,否则我通常会认为XML是UTF-8。 你用什么来确定没有无效字符?只是目不转睛就行不通。如果你以这种方式通过测试,我会建议通过XMLDocument.Load()将该XML文件直接加载到测试C#应用程序中,并查看是否重现该问题。如果将它作为XML文件加载并不能重现问题,那么您可能已经做了一些事情,将它写入一个清理坏字符的文件中。 –

+0

如果您通过将其写入文件进行清理,这些机制可能会提供关于该错误字符存在的线索。 –