从内存映射文件中读取时我会使用什么值? C#

时间:2011-08-26 03:13:42

标签: c# xml character root

所以这个代码片断:

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>中的值,然后打印出来。 但它不能正常工作,我得到无效的字符“。”它运行时的异常。

所以我尝试改变“new byte [3388];”没有<root></root>的字符串的整个长度是3388(在hdd上打印到TXT文件以找到它)所以我添加了13并获得3401(因为根标签有多长,我必须添加到修复多个根错误)

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

感谢

1 个答案:

答案 0 :(得分:1)

所以有一些想法:

您的错误是由XML字符串中的非打印字符引起的,这会导致XMLDocument.LoadXML()中的XML验证失败。

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

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