У меня точно такая же проблема, как и у вас годами.
Для простого неинтерактивного использования мне нравится использовать редактор двоичных блоков BBE . BBE - это двоичный код, как SED - текст, включая его архаичный синтаксис и простоту, однако в нем часто отсутствуют функции, в которых я часто нуждаюсь, поэтому мне приходится комбинировать его с другими инструментами. Итак, BBE - это только частичное решение. Также обратите внимание, что у BBE не было никаких обновлений или улучшений в течение многих лет.
Конечно, можно использовать xxd
до и xxd -r
после редактирования данных с помощью текстовых инструментов, но это не сработает, если данные большие и требуется произвольный доступ, например, при обработке блочных устройств.
(Примечание. Для Windows существует, по крайней мере, дорогой, проприетарный язык сценариев WinHex, но он никуда нас не приведет.)
Для более сложного бинарного редактирования я обычно прибегаю к Python, хотя иногда он слишком медленный для больших файлов, что является его основным недостатком. Я надеюсь, что Pyston (Python, использующий LLVM для компиляции в оптимизированный машинный код) когда-нибудь станет достаточно зрелым, чтобы его можно было использовать, или, что еще лучше, кто-то разработает и внедрит бесплатный компактный, быстрый и универсальный язык сценариев двоичной обработки, для которого AFAIK не существует. U * IX подобных систем пока нет.
ОБНОВИТЬ
Мне также довелось использовать доморощенный, плоский ассемблер Intel x86 с открытым исходным кодом или сокращенно fasm, который превратился в нечто большее, чем просто ассемблер.
Он имеет мощный, основанный на текстовом блоке макрос-препроцессор (сам по себе полный язык Тьюринга) с синтаксисом в традиции макроязыка Borland Turbo на ассемблере, но гораздо более продвинутый.
Кроме того, он имеет язык манипулирования данными, который позволяет двоично включать произвольные файлы, выполнять все виды двоичных и арифметических манипуляций с ним (только целые числа) во время «компиляции» и записывать результат в выходной файл. Этот язык манипулирования данными имеет управляющие структуры и также завершен.
Это гораздо проще в использовании, чем написание программы, которая выполняет некоторые бинарные манипуляции в C и, возможно, даже в Python. Кроме того, он загружается ослепительно быстро, так как это исполняемый файл небольшого размера, почти не имеющий внешних зависимостей (существует две версии: либо требуется только libc, либо он может работать как статический исполняемый файл непосредственно в ABI ядра Linux).
У него есть некоторые края ерша, как
не поддерживает параллелизм
при записи в 32-битной сборке x86 (хотя и работает на x86_64), вам, вероятно, понадобится qemu или аналогичный эмулятор, если вы хотите запустить его на чем-то другом, кроме x86 или x86_64
Это мощный макро-препроцессорный язык, который завершается, это означает, что вам лучше иметь некоторый опыт работы с такими языками, как Lisp, Haskell, XSLT или, возможно, M4 будет лучшим выбором.
все данные, которые должны быть записаны в выходной файл, выполняются в «плоском» буфере в памяти, и этот буфер может увеличиваться, но не уменьшаться, пока выходной файл не будет записан и не завершен. Это означает, что файлы могут быть сгенерированы не более, чем у вас осталось основной памяти за один запуск.
данные могут быть записаны только в один выходной файл для каждого запуска Fast
да, это доморощенный, очень аккуратный и умный, хотя
chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()
вы смотрели на это?