C # чтение и замена двоичных данных в текстовом файле - PullRequest
2 голосов
/ 28 июня 2011

У меня есть файл, который содержит текстовые данные и двоичные данные.Возможно, это не очень хорошая идея, но я ничего не могу с этим поделать.Я знаю конечную и начальную позиции двоичных данных.

Как лучше всего читать эти двоичные данные между этими позициями, сделать из них строку Base64, а затем записать ее обратно в позициюэто было.

РЕДАКТИРОВАТЬ: строка в кодировке Base64 не будет иметь ту же длину, что и двоичные данные, поэтому мне может потребоваться заполнить строку Base64 длиной двоичных данных.

Ответы [ 3 ]

0 голосов
/ 28 июня 2011
int binaryStart = 100;
int binaryEnd = 150;

//buffer to copy the remaining data to it and insert it after inserting the base64string
byte[] dataTailBuffer = null;

string base64String = null;

//get the binary data and convert it to base64string
using (System.IO.Stream fileStream = new FileStream(@"c:\Test Soap", FileMode.Open, FileAccess.Read))
{
    using (System.IO.BinaryReader reader = new BinaryReader(fileStream))
    {
        reader.BaseStream.Seek(binaryStart, SeekOrigin.Begin);

        var buffer = new byte[binaryEnd - binaryStart];

        reader.Read(buffer, 0, buffer.Length);

        base64String = Convert.ToBase64String(buffer);

        if (reader.BaseStream.Position < reader.BaseStream.Length - 1)
        {
            dataTailBuffer = new byte[reader.BaseStream.Length - reader.BaseStream.Position];

            reader.Read(dataTailBuffer, 0, dataTailBuffer.Length);
        }
    }
}

//write the new base64string at specifid location.
using (System.IO.Stream fileStream = new FileStream(@"C:\test soap", FileMode.Open, FileAccess.Write))
{
    using (System.IO.BinaryWriter writer = new BinaryWriter(fileStream))
    {
        writer.Seek(binaryStart, SeekOrigin.Begin);

        writer.Write(base64String);//writer.Write(Convert.FromBase64String(base64String));

        if (dataTailBuffer != null)
        {
            writer.Write(dataTailBuffer, 0, dataTailBuffer.Length);
        }
    }
}
0 голосов
/ 29 июня 2011

Очевидно, что запись base-64 вместо двоичных данных не может работать, так как base-64 будет длиннее.Итак, вопрос в том, для чего вам нужно это сделать?

Я предположу, что вы унаследовали этот ужасный двоичный формат файла, и вы хотите использовать текстовый редактор для редактирования текстовых частей этогодвоичный файл.Если это так, то, возможно, вам нужно более надежное преобразование двоичного кода в текстовое в двоичное.

Я рекомендую использовать base-64 для двоичных фрагментов, но остальныефайл должен быть упакован в XML или другой формат, который будет легко анализировать и интерпретировать.XML хорош, потому что парсеры для него уже доступны в системе.

<mydoc>
    <t>Original text</t>
    <b fieldId="1">base-64 binary</b>
    <t>Hello, world!</t>
    <b fieldId="2">928h982hr98h2984hf</b>
</mydoc>

Этот файл может быть легко создан из вашей спецификации, и его можно легко редактировать в любом текстовом редакторе.Затем файл может быть преобразован обратно в исходный формат.Если какой-либо текст внедряется в двоичные поля, он может быть обрезан.Аналогично, слишком короткий текст может быть дополнен пробелами.

0 голосов
/ 28 июня 2011

Вы захотите использовать объект FileStream, а также методы Read (byte [], int, int) и Write (byte [], int, int).

Хотя пункт о том, что base64 больше двоичного, действителен - вам действительно нужно получить данные за пределами конечной точки того, что вы хотите заменить, сохранить их, записать в файл новые данные и записать сохраненные данные после завершения.

Полагаю, вы не пытаетесь модифицировать exe-файлы для написания вирусов здесь ...;)

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