Я пытаюсь исправить файл с помощью bsdiff, моя проблема в том, что я должен сделать это, имея немного доступной памяти. В соответствии с этим ограничением мне нужно изменить исходный файл с помощью патча, чтобы получить целевой файл. Основы Bsdiff следующие:Используйте bsdiff, являющийся исходным и целевым файлом того же самого. Другие альтернативные алгоритмы подходят для этого?
заголовок: не очень релевантно в этом объяснении.
данных блок управления:
mixlen-> число байтов, которые будут изменены комбинируя байты из исходного
файла и байты, полученные из блока дифференциала.copylen-> количество добавляемых байтов. Это совершенно новые дополнительные данные , которые необходимо добавить в наш файл. Эти байты считываются из дополнительного блока .
- seeklen-> номер, использованный для определения того, что мы должны прочитать из исходного файла.
Сжатый блок управления.
Сжатый блок разломов.
Сжатый дополнительный блок.
Patch file format:
0 8 BSDIFF_CONFIG_MAGIC
8 8 X
16 8 Y
24 8 sizeof(newfile)
32 X control block
32+X Y diff block
32+X+Y ??? extra block
with control block a set of triples (x,y,z) meaning "add x bytes
from oldfile to x bytes from the diff block; copy y bytes from the
extra block; seek forwards in oldfile by z bytes".
Таким образом, проблема в том, что bsdiff считает, у меня всегда есть исходный файл без каких-либо изменений, поэтому он использует его, чтобы изменить данные, которые я уже изменил (если рассмотреть источник один и тот же файл в качестве цели) , Во-первых, я попытался изменить порядок изменений, но в некоторых случаях эти изменения влияют на память, которая будет использоваться в будущем для другой модификации. Возможно, этот алгоритм не подходит мне.
Существует ли другой подходящий для этого алгоритм? Есть ли какая-либо реализация BSDIFF или что-то подобное, что мне нужно?
Прежде чем углубиться в работу Bsdiff, я провел некоторое исследование, найдя VCDIFF (используется Xdelta), но он также, похоже, имеет такое же поведение, что я еще не вкопался в код, поэтому пока не знаю если он генерирует патч в том же самом, что и Bsdiff.
Еще один момент для замечаний - я пытаюсь его реализовать в C.
Отредактировано 04.10.2016: Я попытался изменить порядок исправлений, потому что, имея адреса для изменения упорядоченного от меньшего к большему, я думал, что смогу справиться с этой проблемой, сохраняя исходные данные памяти в буфер до следующего которая требует, чтобы исходные данные были выполнены, но, похоже, важно также, что порядок патчей также имеет значение, возможно, в Bsdiff он несколько раз изменяет одну и ту же часть памяти, пока не получит нужные данные. Любая идея будет очень желанной, если кто-то знает об этом.
С наилучшими пожеланиями,
Иван