Я фактически предлагаю отказаться от файла и перейти к потоку блоков. Процедура применения патча будет работать именно с этим потоком, не важно откуда полученным. Прочитали блок "начало патча" - поехали. Количество блоков в заголовке - а зачем? Тогда уж просто иметь ещё блок типа "конец патча" с контрольной суммой оного.

Такой подход позволит объединять патчи для нескольких документов в один файл, надо только с заголовочным блоком определиться.

Как объединять. В блоке "начало патча" кроме контрольной суммы указываем ещё и имя файла. Тогда diff сможет по списку файлов сформировать такой патч-файл:
[НАЧАЛО ПАТЧА (файл: file1.odc)]
[ВСТАВКА тут данные что и куда вставили]
[ИЗМЕНЕНИЕ тут данные что и как изменили]
[КОНЕЦ ПАТЧА]
[НАЧАЛО ПАТЧА (файл: dir\file2.odc)]
...
[КОНЕЦ ПАТЧА]
...

А утилита patch соответственно его применяет, вставая колом если не найдёт указанные файлы или их хеши не совпадут с ожидаемыми.

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

Тэг блока - да любая константа, подтверждающая что это - блок. Хоть 123. Чисто для контроля. В принципе не обязателен, конечно. Разве что для частичного восстановления битого патча (а вдруг?)