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

вид-u удаляет уникальные строки. Так, потенциальная проблема состоит в том, что эти три строки не являются тем же, и sort -u оставит всех их:

foo
foo 
foo 

Неважно, как тесно Вы смотрите, его твердое для замечания почему. Таким образом, если Вы не берете шестнадцатеричный дамп, с xxd например:

0000000: 666f 6f0a 666f 6f20 0a66 6f6f e280 820a  foo.foo .foo....

0x0a новая строка, если Вы не знакомы с шестнадцатеричными дампами. Так три "нечто" s:

666f 6f         0a
666f 6f20       0a
666f 6fe2 8082  0a

Ага! Это на самом деле foo, foo<SPACE> ( 0x20), и foo<EN-SPACE> ( 0xe28082, который является U+2002, закодированным в UTF-8).

Вы, вероятно, получили что-то подобное продолжение. Необходимо использовать Hex-редактор или набор текстового редактора для показа невидимых символов. Например, вот то, в чем это похоже gvim с :set list. Я только что ввел ga команда для наблюдения, каков символ под курсором, показывая что его U+2002. Можно также видеть как конец строки ($) не то, где Вы ожидаете на двух с пробелами после них:

screenshot of gvim demonstrating :set list

15
23.05.2017, 15:40
4 ответа

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

Для простых неинтерактивных применений мне нравится использовать редактор двоичных блоков BBE . BBE - это двоичный код, как SED - текстовый, включая его архаичный синтаксис и простоту, однако в нем отсутствует множество функций, которые мне часто нужны, поэтому мне приходится комбинировать его с другими инструментами. Итак, BBE - это лишь частичное решение. Также обратите внимание, что BBE не имеет обновлений или улучшений в течение многих лет.

Конечно, можно использовать xxd до и xxd -r после редактирования данных с помощью текстовых инструментов, но это не сработает, если данные большие и произвольный доступ необходим, например, при обработке блочных устройств.

(Примечание: для Windows существует, по крайней мере, дорогостоящий проприетарный язык сценариев WinHex, но он нас ни к чему не приведет.)

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

ОБНОВЛЕНИЕ

Я также использовал homebrew, ассемблер Intel x86 с открытым исходным кодом плоский ассемблер или fasm для краткости, который превратился в нечто большее, чем просто ассемблер.

Он имеет мощный макропроцессор на основе текстовых блоков (сам по себе полный язык по Тьюрингу) с синтаксисом в традициях макроязыка Borland Turbo Assessment, но гораздо более продвинутый.

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

Это намного проще в использовании, чем писать программу, которая выполняет некоторые бинарные манипуляции на C и, возможно, даже на python. Кроме того, он загружается ослепительно быстро, поскольку это исполняемый файл небольшого размера почти без внешних зависимостей (существует 2 версии: либо для него требуется только libc, либо он может работать как статический исполняемый файл непосредственно в ABI ядра Linux).

У него есть некоторые грани, например,

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

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

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

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

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

  6. да, это доморощенный, действительно изящный и умный

2
27.01.2020, 19:50

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

apt-cache show beav extract :

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

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

1
27.01.2020, 19:50

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

0
27.01.2020, 19:50

Вы не обязательно должны «принимать мир» с распакомк 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 и люди, вероятно, будут рады помочь.

2
27.01.2020, 19:50

Теги

Похожие вопросы