Безопасно ли использовать стандартный ввод и вывод с двоичными данными?

14

Мне нужно разбить двоичный файл на две части. Мне было интересно, можно ли использовать голову и / или хвост, но потом я подумал ... безопасно ли использовать перенаправление, трубопровод и т. Д. С двоичными данными? Новые строки портятся, или игнорируются пустые значения, или backspace или delete делают что-то особенное? (Баш, Кубунту 18.04 LTS)

B.Tanner
источник
1
Посмотрите на splitкоманду.
egmont

Ответы:

19

Да, это безопасно, если вы передадите его другому процессу или сохраните в файл. Существует потенциальная «странность», если вы разрешите двоичному выводу на печать на терминал, поскольку он может содержать escape-последовательности (случайным образом), которые могут временно испортить отображение терминала.

Эрик Минц
источник
6
В этом случае вы можете напечатать resetи нажать Enter, чтобы исправить это.
Баард Копперуд
4
@BaardKopperud Я думал, что где-то читал о некоторых случаях, когда tset / reset не будет работать
Xen2050
1
@ Xen2050 Я не знаю. единственный случай, который произойдет, если какая-либо escape-последовательность изменит раскладку / кодировку клавиатуры, так что при наборе текста reset<enter> фактически не будет набираться та последовательность символов, которую видит терминал ...
Bakuriu
3
См. Также « Исправить терминал после отображения двоичного файла» и « Почему консоль иногда требует сброса после сочетания клавиш CTRL + C» . Как было предложено в первой ссылке, stty sane; tput rs1последовательность команд поможет вам, когда есть угловые случаи, когда вы resetне работаете. Такие случаи, в дополнение к упомянутым Бакуриу, могут включать в себя ширину линии терминала / столбцов или я предполагаю настройки, относящиеся к последовательной связи (скорость передачи / четность).
Сергей Колодяжный
1

Основная проблема с использованием команд типа headили tailсостоит в том, что они ориентированы на строки, а двоичные файлы - нет. Если в них есть новые строки, они часто не используются для представления конца строки, и если они есть, они могут быть просто частью строк, таких как программные сообщения или поля данных.

Если данные структурированы каким-либо образом, вы должны принять это во внимание при выборе точек разделения, чтобы не разбивать структуры в середине.

Если вы знаете структуру файла, вы можете использовать такую ​​команду, как

dd -if input-file -of output-file ...

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

Похоже, что splitкоманда, упомянутая @egmont, автоматизирует этот процесс для вас, но она по умолчанию ориентирована на строки, поэтому вам придется указать дополнительные параметры, например, указать размер --bytes countкаждого фрагмента файла. быть.


В качестве примечания: если вы не знаете, что находится в файле, но подозреваете, что он содержит хотя бы некоторые значимые текстовые данные, эта stringsкоманда является отличным способом первого взгляда, чтобы увидеть, с чем вы имеете дело.

strings -n 6 file | less

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

Если вам позже потребуется более подробно изучить файл с помощью бинарного редактора, например hexedit, у вас будут некоторые ориентиры, указывающие, где можно найти что-то интересное.

stringsимеет опцию - t x которая будет предшествовать каждой напечатанной строке с ее смещением в файл в шестнадцатеричном формате (o для восьмеричного / d для десятичного), чтобы вы знали, где ее найти позже Даже с очень короткими файлами приходится иметь дело, когда нужно смотреть на них символ за символом.

Джо
источник