Оболочкообразная среда для двоичной обработки

15

Этот вопрос приходил ко мне пару раз раньше, теперь, в ответ на вопрос « Цикл по бинарным блокам данных» из stdin в ответах Bash, приведенный в /programming/993434/what-language-is-to-binary как-perl-is-to-text также не были удовлетворительными.

Я ищу среду сценариев, специально предназначенную для обработки ввода-вывода с двоичными файлами. Я знаю, что могу использовать один из полноценных языков программирования (c / Python / ...), но они имеют огромные накладные расходы на инициализацию и кодирование (выделение и fread / fwrite в c, цепочки битов в Python ...), не говоря уже о они менее подходят для написания сценариев (вызова других приложений из него). Perl не лучше с его unpackфункциями, строковыми операциями и тупым синтаксисом.

Нечто подобное od, но как язык.

Что я ожидаю:

  1. установить или изменить порядковый номер с помощью одного переключателя / команды.
  2. простая спецификация требуемого типа (что - то вроде расширения Баша read varс int32 var, и float varт.д.).
  3. обработка двоичных сквозных каналов, пропуск заданного количества байтов.
  4. стандартное управление потоком сценариев (для / if / ...), к которому мы привыкли.

Я хотел бы обрабатывать необработанные данные (фотографии, научные данные, неизвестные и плохо документированные форматы) с той же легкостью и пониманием, которые вы получаете при проверке файлов ASCII. Я использую cсейчас, но это не оптимально для специальных сценариев, и не может быть интерактивным.

Кто-нибудь знает такой инструмент? Нет кликабельного программного обеспечения с графическим интерфейсом, пожалуйста, оно должно работать над ssh, другими скриптами и так далее. «Не существует» - приемлемый, но удручающий ответ.

Орион
источник
2
Это не снимает боль времени запуска, но я нахожу байты из Python 3.3 вместе с plumbum очень работоспособными: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()вы смотрели на это?
Anthon
Вы можете взять код C, который у вас есть, и превратить его в набор инструментов командной строки, которые вы можете использовать в скрипте bash. Хотя вы не можете поместить двоичный файл в переменную оболочки, вы можете сохранить его в именованных ('fifo') каналах; их содержимое хранится в памяти, пока вы не захотите их прочитать.
Златовласка
1
В ваших рассуждениях о WRT python и perl, кстати, есть серьезный недостаток. В то время как отдельные инструменты командной строки компилируются, сценарии оболочки не являются и требуют большого количества разветвлений (если вы хотите дорого, разветвление это). Ваше обсуждение, другой вопрос и т. Д. Подразумевают, что вы будете в порядке, используя bash здесь, если он может обрабатывать двоичные файлы. Python и Perl скрипты и прекомпилируются. Если вы сравните сравнительно сложный скрипт на python или perl со сценарием параллельного bash, perl или python будут на порядок быстрее . Если вы не верите мне, вы можете искать в Интернете доказательства обратного.
Златовласка
Я не ищу инструмент , который работает быстро, я искал что - то я могу закодировать быстро. Например, если у меня есть странная программа, которая выводит двоичный тип int для размера массива структур (int, float, float), которые следуют после него, я бы хотел быстро прочитать размер массива и выполнить цикл по массиву, возможно вычисляя некоторые кумулятивный или максимум некоторых компонентов, или просто напечатайте один компонент как столбец ascii для обработки gnuplot. Anthon: спасибо, я не знал об этом, это будет полезно. Златовласка: я пытаюсь избежать этого, но я могу просто написать свой собственный инструмент в конце :)
orion
2
Похоже , вам нужен учебник о том, как использовать perl«s unpack(ᵔᴥᵔ)
Stéphane Chazelas

Ответы:

2

У меня точно такая же проблема, как и у вас годами.

Для простого неинтерактивного использования мне нравится использовать редактор двоичных блоков 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).

У него есть некоторые края ерша, как

  1. не поддерживает параллелизм

  2. при записи в 32-битной сборке x86 (хотя и работает на x86_64), вам, вероятно, понадобится qemu или аналогичный эмулятор, если вы хотите запустить его на чем-то другом, кроме x86 или x86_64

  3. Это мощный макро-препроцессорный язык, который завершается, это означает, что вам лучше иметь некоторый опыт работы с такими языками, как Lisp, Haskell, XSLT или, возможно, M4 будет лучшим выбором.

  4. все данные, которые должны быть записаны в выходной файл, выполняются в «плоском» буфере в памяти, и этот буфер может увеличиваться, но не уменьшаться, пока выходной файл не будет записан и не завершен. Это означает, что файлы могут быть сгенерированы не более, чем у вас осталось основной памяти за один запуск.

  5. данные могут быть записаны только в один выходной файл для каждого запуска Fast

  6. да, это доморощенный, очень аккуратный и умный, хотя

Франки
источник
2

Вам не обязательно «мириться» с распаковкой Perl ... одна из замечательных особенностей Perl - это то, как вы можете использовать парсер и таблицу символов для создания своего собственного языка в пользовательском пакете.

Это в основном то, что вы ищете?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

Упражнение состоит в том, чтобы выучить достаточно Perl для написания пакета MyBinLib. Спросите на форуме Perl, и люди, вероятно, будут рады помочь.

М Конрад
источник
1

Вы сталкивались beavс макросами, но я не смог найти сценарии,

apt-cache show beav извлечь:

С помощью beav вы можете редактировать файлы в HEX, ASCII, EBCDIC, OCTAL, DECIMAL и BINARY. Вы можете отображать, но не редактировать данные в режиме FLOAT. Вы можете искать или искать и заменять в любом из этих режимов. Данные могут отображаться в форматах BYTE, WORD или DOUBLE WORD. Во время отображения СЛОВ или ДВОЙНЫХ СЛОВ данные могут отображаться в порядке следования байтов в INTEL или MOTOROLA. Данные любой длины могут быть вставлены в любую точку файла. Источником этих данных может быть клавиатура, другой буфер или файл. Любые отображаемые данные могут быть отправлены на принтер в отображаемом формате. Файлы, которые больше памяти, могут быть обработаны.

Тогда есть то, xxdчто конвертирует в / из двоичного / ascii режима отображения и может быть объединено с sedили vi, но не имеет функции замены байтов.

X Тянь
источник
0

Вы всегда можете пойти за золотом и перейти в C или ASM. Если вы работаете с необработанным двоичным файлом, просто сбросьте его прямо с регистра. Вы уже там.

штифтик
источник