Этот вопрос приходил ко мне пару раз раньше, теперь, в ответ на вопрос « Цикл по бинарным блокам данных» из stdin в ответах Bash, приведенный в /programming/993434/what-language-is-to-binary как-perl-is-to-text также не были удовлетворительными.
Я ищу среду сценариев, специально предназначенную для обработки ввода-вывода с двоичными файлами. Я знаю, что могу использовать один из полноценных языков программирования (c / Python / ...), но они имеют огромные накладные расходы на инициализацию и кодирование (выделение и fread / fwrite в c, цепочки битов в Python ...), не говоря уже о они менее подходят для написания сценариев (вызова других приложений из него). Perl не лучше с его unpack
функциями, строковыми операциями и тупым синтаксисом.
Нечто подобное od
, но как язык.
Что я ожидаю:
- установить или изменить порядковый номер с помощью одного переключателя / команды.
- простая спецификация требуемого типа (что - то вроде расширения Баша
read var
сint32 var
, иfloat var
т.д.). - обработка двоичных сквозных каналов, пропуск заданного количества байтов.
- стандартное управление потоком сценариев (для / if / ...), к которому мы привыкли.
Я хотел бы обрабатывать необработанные данные (фотографии, научные данные, неизвестные и плохо документированные форматы) с той же легкостью и пониманием, которые вы получаете при проверке файлов ASCII. Я использую c
сейчас, но это не оптимально для специальных сценариев, и не может быть интерактивным.
Кто-нибудь знает такой инструмент? Нет кликабельного программного обеспечения с графическим интерфейсом, пожалуйста, оно должно работать над ssh, другими скриптами и так далее. «Не существует» - приемлемый, но удручающий ответ.
chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()
вы смотрели на это?perl
«sunpack
(ᵔᴥᵔ)Ответы:
У меня точно такая же проблема, как и у вас годами.
Для простого неинтерактивного использования мне нравится использовать редактор двоичных блоков 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
да, это доморощенный, очень аккуратный и умный, хотя
источник
Вам не обязательно «мириться» с распаковкой Perl ... одна из замечательных особенностей Perl - это то, как вы можете использовать парсер и таблицу символов для создания своего собственного языка в пользовательском пакете.
Это в основном то, что вы ищете?
Упражнение состоит в том, чтобы выучить достаточно Perl для написания пакета MyBinLib. Спросите на форуме Perl, и люди, вероятно, будут рады помочь.
источник
Вы сталкивались
beav
с макросами, но я не смог найти сценарии,apt-cache show beav
извлечь:Тогда есть то,
xxd
что конвертирует в / из двоичного / ascii режима отображения и может быть объединено сsed
илиvi
, но не имеет функции замены байтов.источник
Вы всегда можете пойти за золотом и перейти в C или ASM. Если вы работаете с необработанным двоичным файлом, просто сбросьте его прямо с регистра. Вы уже там.
источник