2016-09-27 1 views
1

Я пытаюсь исправить файл с помощью 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 он несколько раз изменяет одну и ту же часть памяти, пока не получит нужные данные. Любая идея будет очень желанной, если кто-то знает об этом.

С наилучшими пожеланиями,

Иван

ответ

0

Мы не можем исключить зависимость от исходных данных, не влияя на размер сжатого дельта. Таким образом, вам нужно будет иметь исходные данные без изменений, чтобы BSDIFF работал в описанном вами сценарии.

Смежные вопросы