Как удалить N количество байтов из конца файла, только если они соответствуют указанному массиву байтов - PullRequest
1 голос
/ 16 мая 2019

У меня проблема с созданием программы для обработки предоставленных файлов.Эти файлы представляют собой файлы XML, отформатированные с использованием UTF-8.Как ни странно, некоторые файлы заканчиваются на 0x0A 0x00 и приводят к тому, что наш анализатор XML выдает ошибку.Я ищу, чтобы построить функцию для удаления этих байтов в конце файла, если они существуют, без "жесткого кодирования" 0x0A 0x00.В идеале эта функция могла бы использоваться в будущем для любого подобного поведения с массивом любого размера.

Вот исключение:

System.Xml.XmlException:
hexadecimal value 0x00, is an invalid character. Line 250, position 1.

Это происходит в некоторых файлах, но не во всех.Первопричину такого поведения еще предстоит выяснить.

Извините, у меня нет примера кода, так как я не смог получить что-либо близко к работе :) Я буду редактировать этонапишите, если у меня что-то получится.

Любое понимание приветствуется!

1 Ответ

1 голос
/ 16 мая 2019

Что-то вроде этого должно сработать, имейте в виду, хотя в него не встроена обработка ошибок, это просто базовые функции:

static void TrimFile(string filePath, byte[] badBytes)
    {
        using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
        {
            byte[] bytes = new byte[badBytes.Length];
            file.Seek(-badBytes.Length, SeekOrigin.End);
            file.Read(bytes, 0, badBytes.Length);

            if (Enumerable.SequenceEqual(bytes, badBytes))
            {
                file.SetLength(Math.Max(0, file.Length - badBytes.Length));
            }                
        }
    }

Вы можете назвать это так:

TrimFile(filePath, new byte[] { 0x0A, 0x00 });

Вот тестовый файл, который я создал с 0xCA 0xFE 0xFF 0xFF в конце (некоторые данные бункера)

62 75 6E 6B 20 66 69 6C 65 CA FE FF FF 
bunk fileÊþÿÿ

После запуска TrimFile(filePath, new byte[] { 0xCA, 0xFE, 0xFF, 0xFF });

62 75 6E 6B 20 66 69 6C 65
bunk file

Надеюсь, что этопригодится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...