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

本文关键字:什么 映射 内存 文件 读取 | 更新日期: 2023-09-27 18:06:54

所以这是代码片段:

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();
}

它从共享内存中读取如下信息:

<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(打印到硬盘上的TXT文件来发现这一点),所以我添加了13,得到了3401(因为这是根标签的长度,我必须添加来修复多个根错误)

,但我似乎仍然得到错误关于"。',十六进制值0x00,是无效字符。1号线,7号位置。"

谢谢

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

我的一些想法:

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

查看返回的MemoryMappedViewAccessor类(reader),您想要检查它的Capacity属性,这将是您可以读取的最远范围。ReadByte()是可以的,但如果你知道你的数据是ASCII,为什么不使用ReadChar()和附加它们,因为你去StringBuilder对象?

如果数据本身具有无效字符,则在读取过程中实际上没有办法正确加载它,除非首先以某种方式从字符串中清除这些字符。对于这样的场景,我会将缓冲区转储到一个文件中,然后使用具有"显示所有字符"功能的工具(如notepad++)加载该文件。这将使您能够明确地看到哪些字符和在哪里(如果它们在正常的XML之外,这可能表明您仍然没有完全正确地处理缓冲区)。