Как вы передаете шестнадцатеричные данные напрямую в bc и конвертируете их в двоичный - чисто?

Преобразование шестнадцатеричного (символа) в двоичное полезно, особенно если вы хотите посмотреть на несколько битов, помещенных в какую-либо шестнадцатеричную строку.

По этой причине я хотел бы передать некоторые шестнадцатеричные данные в bc (программа Unix, известная как «базовый калькулятор») и преобразовать их в двоичные символы (единицы и нули).

Как правило, я хотел бы перехватить файл шестнадцатеричных данных (строки шестнадцатеричных данных в файле) и передать его в bc и заставить bc преобразовать его в двоичный. В качестве альтернативы я мог бы преобразовать двоичный файл в шестнадцатеричный с помощью xxd и передать его в bc.

Есть способы сделать это, но, учитывая, что bc нужно несколько директив, все методы кажутся немного запутанными. Как это можно сделать просто, без сценария bash с некоторым циклом for?


person Xofo    schedule 22.07.2015    source источник
comment
В чем именно заключается вопрос?   -  person Etan Reisner    schedule 22.07.2015
comment
Я переписал вопрос. Я использую bc для преобразования шестнадцатеричного в двоичный. Я ищу лучший способ сделать это.   -  person Xofo    schedule 22.07.2015
comment
Спасибо. Выглядит нормально, но вернул символ ›. Думаю, в вашем решении есть синтаксическая ошибка. Но хорошее начало.   -  person Xofo    schedule 22.07.2015
comment
Результат дал много: 0 0 (standard_in) 21788: ошибка синтаксического анализа (standard_in) 21789: ошибка синтаксического анализа (standard_in) 21790: ошибка синтаксического анализа (standard_in) 21791: ошибка синтаксического анализа   -  person Xofo    schedule 22.07.2015
comment
Вы правы ... Я пропустил -u ... Спасибо! Хорошее решение.   -  person Xofo    schedule 22.07.2015


Ответы (2)


Я думаю, это то, что ты хочешь.

{ echo "obase=2; ibase=16"; xxd -c 32 -u -p file.bin; } | bc

Он просто передает как настройки, так и содержимое потокового файла в bc со списком скобок. Флаг -u для xxd позволяет выводить шестнадцатеричные буквы верхнего регистра.

person Etan Reisner    schedule 22.07.2015

Поскольку StackOverflow рекомендует ответить на ваш собственный вопрос, это мое решение:

xxd -c 32 -p file.bin | awk '{print toupper($0)}' | tr '\n' ' ' |  { read line; for i in $line; do echo "obase=2; ibase=16; $i" | bc ; done }

Мне не нравится мое решение, потому что оно кажется запутанным. Я хотел бы разработать способ передачи вывода xxd в bc без цикла for и без использования tr (который я мог бы использовать и в верхнем регистре). В любом случае, это работает, но я думаю, что это можно сделать лучше.

person Xofo    schedule 22.07.2015
comment
Это может показаться неотъемлемой частью вопроса, поскольку сам по себе вопрос все еще не является полноценным вопросом. - person Etan Reisner; 22.07.2015
comment
В идеале хотелось бы сформулировать самый оптимальный вопрос. Этот ответ может жить в своем состоянии, я уверен, что появится лучший ответ. - person Xofo; 22.07.2015