2016-09-27 8 views
1

私はbsdiffを使用してファイルを修正しようとしていますが、私の問題は利用可能なメモリがほとんどないことです。この制約に従って、ターゲットファイルを取得するために、ソースファイルをパッチで修正する必要があります。 Bsdiff basicは次のとおりです。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と同じものでパッチを生成するかどうか。

もう1つの注意点は、Cに実装しようとしていることです。

編集04/10/2016: 修正するアドレスを小さくしてから大きくすると、元のメモリデータを次のバッファに格納するこの問題を処理できると思ったので、パッチの順序を変更しようとしました。元のデータが完了している必要がありますが、パッチの順序も重要です。おそらくBsdiffでは正しいデータが得られるまでメモリの同じ部分を数回修正します。誰かがこれについて知っているなら、どんな考えも大歓迎です。

敬具、

イバン・

答えて

0

私たちは、圧縮されたデルタのサイズに影響を与えることなく、ソースデータへの依存を排除​​することはできません。したがって、説明したシナリオでBSDIFFを動作させるには、ソースデータを変更しないでください。

関連する問題