Какие значения я использую при чтении из отображенного файла памяти C # - PullRequest
0 голосов
/ 26 августа 2011

так этот код снипит:

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-файл на hdd, чтобы выяснить это), поэтому я добавил 13 и получил 3401 (потому что это - длина корневых тегов, которые мне пришлось добавить, чтобы исправить несколько корневая ошибка)

но я все еще получаю сообщение об ошибке "'.', Недопустимое шестнадцатеричное значение 0x00. Строка 1, позиция 7."

спасибо

1 Ответ

1 голос
/ 26 августа 2011

Итак, несколько мыслей:

Ваша ошибка вызвана непечатными символами в строке XML, что приводит к сбою проверки XML в XMLDocument.LoadXML ().

Глядя на класс MemoryMappedViewAccessor, который возвращается (читатель), вы хотите проверить свойство Capacity этого объекта, которое будет самым дальним из всех, которые вы можете прочитать. С ReadByte () все в порядке, но если вы знаете, что ваши данные являются ASCII, почему бы не использовать ReadChar () и добавлять их при переходе к объекту StringBuilder?

Если в самих данных содержатся недопустимые символы, буквально невозможно правильно загрузить их во время процесса чтения, без предварительной очистки этих символов в строке. Для такого сценария я бы выгрузил ваш буфер в файл, а затем загрузил этот файл с помощью инструмента, подобного NotePad ++, который имеет функцию «Показать все символы». Это позволит вам точно определить, какие символы и где (если они находятся за пределами обычного XML, это может указывать на то, что у вас по-прежнему не совсем правильно обрабатываются буферы).

...