Предполагается, что вы пытаетесь заменить известный раздел файла.
- Открыть
FileStream
с доступом для чтения / записи
- Ищите в нужном месте
- Перезаписать существующие данные
Пример кода идет ...
public static void ReplaceData(string filename, int position, byte[] data)
{
using (Stream stream = File.Open(filename, FileMode.Open))
{
stream.Position = position;
stream.Write(data, 0, data.Length);
}
}
Если вы действительно пытаетесь создать двоичную версию string.Replace
(например, «всегда заменять байты {51, 20, 34} на {20, 35, 15}», тогда это довольно сложно. Как краткое описание что бы вы сделали:
- Выделите буфер размером не менее интересующего вас размера
- Неоднократно считывать в буфер, сканируя данные
- Если вы нашли совпадение, вернитесь в нужное место (например,
stream.Position -= buffer.Length - indexWithinBuffer;
и перезапишите данные
Пока звучит просто ... но хитрый момент в том, что данные начинаются с в конце буфера. Вам нужно запомнить все потенциальные совпадения и то, как далеко вы дошли до этого момента, чтобы, если вы получили совпадение при чтении значения буфера next , вы могли его обнаружить.
Вероятно, есть способы избежать этой хитрости, но я не хотел бы пытаться придумать их случайно:)
РЕДАКТИРОВАТЬ: Хорошо, у меня есть идея, которая может помочь ...
- Держите буфер, который по крайней мере вдвое больше, чем вам нужно
- Многократно:
- Скопируйте вторую половину буфера в первую половину
- Заполните вторую половину буфера из файла
- Поиск в буфере целом данных, которые вы ищете
Таким образом, в какой-то момент, если данные присутствуют, они будут полностью в буфере.
Вы должны быть осторожны с тем, где находится поток, чтобы вернуться в нужное место, но я думаю, что это должно работать. Было бы сложнее, если бы вы пытались найти все совпадения, но по крайней мере первое совпадение должно быть достаточно простым ...