2011-08-26 136 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

如果您通過將其寫入文件進行清理,這些機制可能會提供關於該錯誤字符存在的線索。 –