【问题标题】:What values do I use when reading from memory mapped file? C#从内存映射文件中读取时我使用什么值? C#
【发布时间】:2011-08-26 03:13:41
【问题描述】:

所以这是代码片段:

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>

并读取所有&lt;value&gt;&lt;/value&gt; 中的值,然后将其打印出来。 但它工作不正常,我得到无效字符“。”运行时异常。

所以我尝试更改“新字节[3388];”没有&lt;root&gt;&lt;/root&gt; 的字符串的整个长度是 3388(打印到 HDD 上的 TXT 文件以找出答案)所以我添加了 13 并得到了 3401(因为这就是根标签的长度,我必须添加它来修复多个根错误)

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

谢谢

【问题讨论】:

  • 你好像没有使用reader
  • document.LoadXml("" + encoding.GetString(bytes) + "");在这一行中,您究竟是如何填充字节数据的?我的意思是在您显示的代码中,字节被声明,但根本没有填满?
  • 为什么需要内存映射文件?不需要从 XML 文件中读取大约 3K 字节。
  • 这是从 Windows 系统监控应用程序中提取的,这就是他们将数据存储为共享内存中的 xml ish 格式文件的方式,我知道这很糟糕。
  • encoding.GetString(bytes) 我相信这是 zenwalker 的答案,添加根标签是因为 xml 没有主根,只有多个根(您可以在输入 xml 中看到多个根作为 ) 添加根标签修复了我在程序运行时遇到的错误(xmlnode 行上的多个根异常),现在我有了这个。

标签: c# xml character root


【解决方案1】:

所以有一些想法:

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

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

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

【讨论】:

  • 好吧,我将字符串转储到文件中,所以我知道字符串中实际上没有任何无效字符。我不确定,什么是 ASCI?根据我给出的输入样本,你会使用什么编码?谢谢
  • 您使用的编码取决于您的来源。一般来说,来源应该告诉你,否则我通常会假设 UTF-8 用于 XML。你用什么来确定没有无效字符?光看是行不通的。如果您以这种方式通过测试,我建议您通过 XMLDocument.Load() 将该 XML 文件直接加载到测试 C# 应用程序中,然后查看是否重现了该问题。如果将其作为 XML 文件加载不会重现该问题,则您可能已将其写入正在清除坏字符的文件中。
  • 如果您通过将其写入文件来清理它,这些机制可能会提供关于该坏字符存在于何处的线索。
  • XmlReaderSettings.ConformanceLevel 我用它来最终加载片段!为了快速起见,我刚刚打印到 CMD:pastebin.com/z9DbSFUm 这就是我得到的!
  • ConformanceLevel 可以达到一定程度,但最终您会发现由于 XML 处理程序无法正确解析这些字符(这就是它们无效的原因)而导致数据丢失/损坏的情况 - 很高兴它有效,但要小心!
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2012-03-25
  • 2014-12-14
  • 2012-07-17
相关资源
最近更新 更多