Как я могу создать двоичный файл instructions.binс теми же данными, что и instructions.txt. Другими словами, .binфайл должен быть теми же 192 битами, которые есть в .txtфайле, с 32 битами на строку. Я использую Bash на Ubuntu Linux. Я пытался использовать, xxd -b instructions.txtно вывод длиннее, чем 192 бит.
pack("B32", $_)возьмет список строк из 32 битов ( $_который мы только что прочитали из STDIN) и преобразует его в двоичное значение (вы можете использовать его, "b32"если хотите, чтобы в каждом байте был порядок возрастания битов, а не порядок убывания битов; perldoc -f packподробнее см.)
print затем выведет это преобразованное значение в STDOUT, который мы затем перенаправим в наш двоичный файл instructions.bin
Добавление -rопции (обратный режим) в xxd -bдействительности не работает должным образом, потому что xxd просто не поддерживает объединение этих двух флагов (игнорируется, -bесли заданы оба). Вместо этого вы должны сначала преобразовать биты в гекс. Например, вот так:
( echo 'obase=16;ibase=2'; sed -Ee's/[01]{4}/;\0/g' instructions.txt )| bc | xxd -r -p > instructions.bin
Полное объяснение:
Часть внутри скобок создает bcскрипт. Сначала он устанавливает входную базу в двоичное (2), а выходную базу - в шестнадцатеричное (16). После этого sedкоманда печатает содержимое instructions.txtс точкой с запятой между каждой группой из 4 битов, что соответствует 1 шестнадцатеричной цифре. Результат передан в bc.
Точка с запятой - это разделитель команд bc, поэтому все, что делает скрипт, это выводит каждое входное целое число обратно (после преобразования базы).
Вывод bcпредставляет собой последовательность шестнадцатеричных цифр, которую можно преобразовать в обычный файл xxd -r -p.
Извините, в этом все еще есть ошибка порядка байтов. Работаем над его исправлением!
кочевой тип
1
На самом деле это нормально. Я был сбит с толку ранее, используя неправильную ширину вывода в последней команде xxd.
кочевой тип
1
Я проверил сценарий и он работает , но выходы: (standard_in) 1: syntax error. Можете ли вы объяснить, о чем syntax errorидет речь или почему это происходит? Это происходит на вашей машине тоже?
Примечание: во многих оболочках |конец строки работает как обратный слеш: команда продолжается до следующей строки. Таким образом, вы можете избавиться от нескольких обратных косых черт. Я не уверен, что использование символов канала после LF было вашим осознанным решением. Я упоминаю другой способ, если ты не знал.
Камиль Мачоровски
1
Я не знал, спасибо! Мне действительно нравится разбивать конвейер на логические линии и иметь каналы |(или перенаправления >, логические операторы &&и т. Д.) Явно впереди для наглядности / ясности ... возможно, стилистические / предпочтительные вещи.
Attie
1
После некоторых размышлений я могу начать использовать этот стиль, потому что можно сказать, что две линии связаны, исследуя любую из них. Если |в конце следующая строка может выглядеть как отдельная команда, это может сбить с толку. Вот почему я подумал, что стиль может быть вашим осознанным решением.
(standard_in) 1: syntax error
. Можете ли вы объяснить, о чемsyntax error
идет речь или почему это происходит? Это происходит на вашей машине тоже?Мой первоначальный ответ был неверным -
xxd
не могу принять ни-p
или-r
с-b
...Учитывая, что другие ответы работоспособны, и в интересах « другого пути », как насчет следующего:
вход
Выход
Трубопровод Баш:
cat
- не нужно, но используется для ясностиtr -d $'\n'
- удалить все новые строки из вводаread -N 4 nibble
- прочитать ровно 4 × символа вnibble
переменнуюprintf '%x' "$((2#${nibble}))"
преобразовать полубайт из двоичного в 1 × шестнадцатеричный символ$((2#...))
- преобразовать данное значение из базы 2 (двоичная) в базу 10 (десятичная)printf '%x'
- отформатировать данное значение от основания 10 (десятичное) до основания 16 (шестнадцатеричное)xxd -r -p
- reverse (-r
) обычный дамп (-p
) - из шестнадцатеричного в необработанный двоичный файлPython:
<< EOF
) используется для получения контента в код Pythoncat
иtr
- используется для получения чистого (однострочного) вводаrange(0, len(d), 8)
- получить список чисел от 0 до конца строкиd
, шагая по 8 × символов за раз.chr(int(d[i:i+8],2))
- преобразовать текущий slice (d[i:i+8]
) из двоичного в десятичное (int(..., 2)
), а затем в необработанный символ (chr(...)
)[ x for y in z]
- понимание списка''.join(...)
- преобразовать список символов в одну строкуprint(...)
- распечатайисточник
|
конец строки работает как обратный слеш: команда продолжается до следующей строки. Таким образом, вы можете избавиться от нескольких обратных косых черт. Я не уверен, что использование символов канала после LF было вашим осознанным решением. Я упоминаю другой способ, если ты не знал.|
(или перенаправления>
, логические операторы&&
и т. Д.) Явно впереди для наглядности / ясности ... возможно, стилистические / предпочтительные вещи.|
в конце следующая строка может выглядеть как отдельная команда, это может сбить с толку. Вот почему я подумал, что стиль может быть вашим осознанным решением.Вы также можете попробовать опубликовать это на сайте CodeGolf SE, но вот моя альтернативная версия Python (только для кик-апа):
Предположим,
input.txt
содержит ваши данные, и он отформатирован до 32 символов в строке.Это использует
struct
пакет Python 3 и запись / чтение в stdin / out. (В Python 2 это было бы короче).источник