web-dev-qa-db-ja.com

バイナリパッチを作成するにはどうすればよいですか?

バイナリファイルのパッチを作成する最善の方法は何ですか?ユーザーが簡単に適用できるようにしたい(単純なpatchアプリケーションがいいでしょう)。ファイルに対してdiffを実行すると、単にBinary files [...] differ

51
Mike

bsdiffおよびbspatchwebsitemanpagepaperGitHub fork )。

このツールをインストールするには:

  • Windows:ダウンロードして解凍 このパッケージPATHbzip2.exeのコピーも必要です。 「Binaries」リンクからダウンロードしてください here
  • macOS:Homebrewをインストールし、それを使用してbsdiffをインストールします。
  • Linux:パッケージマネージャーを使用してbsdiffをインストールします。
45
Heinzi

Courgette 、GoogleによるChromeチームは、実行可能ファイルにバイナリパッチを適用するための最も効率的なツールのように見えます。

データを引用するには:

開発者チャンネルでの最近の190.1-> 190.4更新のサイズは次のとおりです。

  • 完全更新:10,385,920バイト
  • bsdiff update:704,512バイト
  • ズッキーニの更新:78,848バイト

ビルドの手順 です。 Windowsバイナリ 2018年から Mehrdad の厚意によります。

18

xdelta( websiteGitHub )は別のオプションです。最近のように見えますが、それ以外の場合、bsdiffのような他のツールと比較する方法がわかりません。

使用法:

  • パッチの作成:xdelta -e -s old_file new_file delta_file
  • パッチの適用:xdelta -d -s old_file delta_file decoded_new_file

インストール:

  • Windows: 公式バイナリ をダウンロードします。
  • チョコレート:choco install xdelta3
  • 自作:brew install xdelta
  • Linux:パッケージマネージャーでxdeltaまたはxdelta3として利用可能。
11
Jared Beck

最新のポート:bsdiff/bspatchに非常に便利な.NETポート:

https://github.com/LogosBible/bsdiff.net

私の個人的な選択。私はそれをテストしましたが、それはすべてのリンクのうちの唯一のものでした、私はそれをコンパイルするために箱から出したことができました(Visual Studio、例えば2013で)。 (他の場所のC++ソースは少し古く、少なくとも少し洗練する必要があり、実メモリ(差分ソースサイズ)制限を設定する32ビットのみです。これは、このC++コードbsdiffのポートであり、パッチ結果が同一かどうかもテストします元のコードへ)。

さらなるアイデア:.NET 4.5では、#Zip libを削除することもできます。これはここでの依存関係です。

C++コードよりも少し遅いかどうかは測定していませんが、私にとってはうまくいきました(bsdiff:1〜2分で90MBのファイル)、そして私にとってタイムクリティカルなのはbspdiffではなくbspatchだけです。

X64マシンのメモリ全体が使用されているかどうかは確かではありませんが、それを想定しています。 x64対応ビルド(「任意のCPU」)は少なくとも機能します。 100 MBファイルで試してみました。

-その他:主なターゲットが実行可能ファイルである場合、引用されたGoogleプロジェクト「Courgette」が最適な選択である可能性があります。しかし、それを構築するのは(少なくともWindowsの測定では)作業であり、バイナリファイルの場合は、ドキュメントを理解している限り、純粋なbsdiff/bspatchも使用しています。

7
Philm

小さくて単純なパッチの場合、-a(または--text)オプションを使用してファイルをテキストとして扱うようにdiffに指示するのが最も簡単です。私が理解している限り、より複雑なバイナリ差分は、パッチのサイズを縮小するためにのみ役立ちます。

$ man diff | grep -B1 "as text"
       -a, --text
              treat all files as text
$ diff old new
Binary files old and new differ
$ diff -a old new > old.patch
$ patch < old.patch old
patching file old
$ diff old new
$

ファイルのサイズが同じで、パッチが数バイトを修正するだけの場合、OSで一般的にインストールされるxxdを使用できます。以下は、各ファイルを1行に1バイトの16進表現に変換し、ファイルを差分してコンパクトパッチを作成し、パッチを適用します。

$ xxd -c1 old > old.hex
$ xxd -c1 new > new.hex
$ diff old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$
0
cjfp