# バイナリパッチ

バイナリパッチは、デバイス上のファイルやプログラムにパッチを適用するために使用されます。16進数のワイルドカードを使用して検索と置換を行い、上位/下位ニブルのワイルドカードもサポートしています。例えば、`??` は任意の1バイトを表し、`B?` は `B` で始まる任意のバイト（例：`BA`、`B1`、`B9`）を表します。ワイルドカード `49` `BA` `??` `?C` は、ファイル内で `49` `BA` `..` `.C` に一致する任意の部分にマッチします。以下の呼び出しは、test.bin 内のすべての `AA` `BB` `CC` `D[0-9A-F]` バイトを `AA` `BB` `CC` `DD` に置換します。このAPIは置換回数と置換されたオフセットを返します。

```python
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin")
```

```python
>>> result = d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin")
>>> print (result.count)
1
>>> print (result.replaces[0].offset)
8123
```

```{note}
この例では4バイトのマッチングと置換のみを示していますが、このAPIは任意のバイト数のマッチングと置換をサポートしています。ただし、少なくとも2つの有効な検索文字が必要です。
```

最大置換回数を制限する必要がある場合は、`maxreplace` パラメータで設定します。デフォルトではすべて置換されます。

```python
d.hex_patch("AA BB CC D?", "AA BB CC DD", "/data/test.bin", maxreplace=2)
```

テストモードもあります。このモードでは、置換操作を行わずに、ファイル内でマッチする位置を検索するだけです。

```python
d.hex_patch("AA BB ?? ??", "AA BB 00 00", "/data/test.bin", dryrun=True)
```

```{hint}
ファイルパスはワイルドカードマッチング（glob）をサポートしています。例えば、`/data/app/*/test.bin` は `/data/app` ディレクトリ直下の任意のディレクトリ内にある `test.bin` ファイルを検索し、マッチさせます。
```