Оболонка, що нагадує оболонку для двійкової обробки


15

Це питання мені приходило кілька разів раніше, зараз у відповідь на запитання Прокручуйте через фрагменти бінарних даних від stdin у відповіді Bash, подані на /programming/993434/what-language-is-to-binary -as-perl-is-to text також не був задовільним.

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

Щось схоже od, але як мова.

Що я очікую:

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

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

Хтось знає такий інструмент? Жодного програмного забезпечення для графічного графічного інтерфейсу, будь ласка, воно потребує роботи над ssh, з інших сценаріїв тощо. "Не існує" - прийнятна, але гнітюча відповідь.


2
Це не забирає біль за час запуску, але я вважаю, що байти з Python 3.3 разом із плюмбумом є дуже працездатними: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()ви це подивилися?
Антон

Ви можете взяти код C, який у вас є, і перетворити його в набір інструментів командного рядка, які ви могли використовувати в скрипті bash. Хоча ви не можете помістити бінарний файл у змінну оболонки, ви можете зберігати його у названих ('fifo') трубах; їх вміст зберігається в пам'яті, поки ви не захочете їх прочитати.
золотинок

1
У ваших міркуваннях WRT python and perl, BTW, є серйозна вада. У той час як окремі інструменти командного рядка компілюються, сценарії оболонки не містять великого розміщення (якщо ви хочете дорого, роздрібнення це). Ваша дискусія, інше запитання і т. Д. Означають, що ви добре будете використовувати тут bash, якби він міг працювати з двійковим. Python і Perl скрипти і прекомпіліруются. Якщо ви порівняєте досить складний сценарій python або perl порівняно з паралельним скриптом bash, perl або python будуть на порядок швидшими . Якщо ви мені не вірите, ви можете шукати в Інтернеті докази протилежного.
золотинок

Я не шукаю інструмент , який працює швидко, я шукав що - то я можу закодувати швидко. Наприклад, якщо у мене є дивна програма, яка виводить бінарний int для масиву структур (int, float, float), що слідують за ним, я хотів би швидко прочитати розмір масиву та циклічно перетворити масив, можливо обчисливши деякі накопичувальний або максимум деяких компонентів, або просто надрукувати один компонент у вигляді стовпця ascii для обробки gnuplot. Ентон: дякую, я про це не знав, це буде корисно. goldilocks: Я намагаюся цього уникнути, але, можливо, просто напишу власний інструмент наприкінці :)
orion

2
Здається, що вам потрібен підручник про те, як користуватися perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

Відповіді:


2

У мене теж роки є та сама проблема, що і у вас.

Для простих неінтерактивних цілей я люблю використовувати редактор бінарних блоків BBE . BBE - це бінарне, як SED - це текст, включаючи його архаїчний синтаксис та простоту, однак у нього відсутнє багато особливостей, ніж мені часто потрібно, тому мені доводиться поєднувати його з іншими інструментами. Отже, BBE - це лише часткове рішення. Також зауважте, що компанія BBE протягом останніх років не проводила жодних оновлень та удосконалень.

Звичайно, можна використовувати xxdдо і xxd -rпісля редагування даних текстовими інструментами, але це не спрацює, коли дані є великими і потрібен випадковий доступ, наприклад, при обробці блокових пристроїв.

(Примітка. Для Windows існує щонайменше дорогий, фірмовий сценарій WinHex, але це нікуди не дінеться.)

Для більш складного бінарного редагування я зазвичай також повертаюся до Python, хоча для великих файлів іноді це занадто повільно, що є його головним недоліком. Я сподіваюся, що Pyston (Python, що використовує LLVM для компіляції до оптимізованого машинного коду), коли-небудь буде достатньо зрілим, щоб бути зручним для використання, а ще краще, хтось розробить та впровадить безкоштовну компактну, швидку та універсальну бінарну мову обробки сценаріїв, для якої AFAIK не існує У * IX подібних систем поки немає.

ОНОВЛЕННЯ

Мені трапляється також використовувати домашню мову, плоский асемблер з відкритим кодом Intel x86 асемблер , або короткий файл fasm, який перетворився на набагато більше, ніж просто асемблер.

Він має потужний макропропроцесор на основі текстового блоку (сам по собі цілковитий повний мову) із синтаксисом традицій макромовної мови бордо-турбо-асемблера, але значно вдосконаленим.

Крім того, він має мову маніпулювання даними, що дозволяє в двійкові файли включати довільні файли, робити всі види двійкових та арифметичних маніпуляцій на ньому (лише цілі числа) у "час компіляції" та записувати результат у вихідний файл. Ця мова маніпулювання даними має керуючі структури і також завершується.

Це набагато простіше у використанні, ніж написання програми, яка виконує деякі бінарні маніпуляції в C і, ймовірно, навіть у python. Крім того, він завантажується сліпуче швидко, оскільки це невеликий розмір виконавчого файлу майже без зовнішніх залежностей (Є дві версії: або він вимагає лише libc, або він може працювати як статичний виконуваний файл безпосередньо на ядрі Linux ABI).

У нього є кілька іржі, як

  1. не підтримуючи одночасність

  2. пишучи в 32-бітній збірці x86 (хоча працює на x86_64), вам, ймовірно, потрібен qemu або подібний емулятор, якщо ви хочете запустити його на чомусь іншому, ніж x86 або x86_64

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

  4. всі дані, що підлягають запису у вихідний файл, виконуються в "плоскому" буфері в пам'яті, і цей буфер може рости, але не стискатися, поки вихідний файл не буде записаний і не завершиться fasm. Це означає, що можна генерувати файли не більше, ніж у вас є основна пам'ять за один запуск файлу.

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

  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;
}

Вправа тоді полягає в тому, щоб навчитися достатньо заздалегідь писати пакет MyBinLib. Запитайте на форумі Perl, і люди, ймовірно, будуть раді допомогти.


1

Чи стикалися beavви з макросами, але я не міг знайти сценарії,

apt-cache show beav витяг:

За допомогою beav ви можете редагувати файл у форматі HEX, ASCII, EBCDIC, OCTAL, DECIMAL та BINARY. Ви можете відображати, але не редагувати дані в режимі FLOAT. Ви можете шукати або шукати та замінювати в будь-якому з цих режимів. Дані можуть відображатися у форматах BYTE, WORD або DOUBLE WORD. Під час відображення WORDS або DOUBLE WORDS дані можуть відображатися в порядку введення байтів INTEL або MOTOROLA. Дані будь-якої довжини можна вставити в будь-яку точку файлу. Джерелом цих даних може бути клавіатура, інший буфер або файл. Будь-які дані, що відображаються, можуть надсилатися на принтер у відображеному форматі. Файли, більші за об'єм пам'яті, можуть оброблятися.

Тоді є те, xxdщо перетворює в / з бінарного / ascii режиму відображення, і його можна комбінувати разом з sedабо vi, але не має функції заміни байтів.


0

Ви завжди можете піти на золото і впасти в C або ASM. Якщо ви працюєте з сирими бінарними файлами, просто відмовтеся від реєстру. Ви «вже є».

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.