# Бинарный патч

Бинарные патчи используются для внесения исправлений в файлы или программы на устройстве. Для поиска и замены используются шестнадцатеричные маски, поддерживающие подстановку для старшего и младшего полубайта. Например, `??` представляет любой байт, `B?` представляет любой байт, начинающийся с `B` (например, `BA`, `B1`, `B9`), а маска `49` `BA` `??` `?C` будет соответствовать любому сегменту в файле, совпадающему с `49` `BA` `..` `.C`. Следующий вызов заменит все байты `AA` `BB` `CC` `D[0-9A-F]` в файле test.bin на `AA` `BB` `CC` `DD`, и интерфейс вернет количество замен и их смещения.

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

Чтобы ограничить максимальное количество замен, используйте параметр `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 найдет и сопоставит все файлы test.bin в любом подкаталоге первого уровня в директории /data/app.
```