Я решал задачу, в которой нашел файл данных без расширения. Команда file
показывает, что это data file (application/octet-stream)
. Команда hd
показывает ВНП. в последней строке. Поэтому, если я переверну этот файл, то получу файл формата .PNG , я искал везде, но не нашел решения, объясняющего, как перевернуть содержимое двоичного файла.
11
In
zsh
(единственная оболочка, которая может внутренне работать с двоичными данными (если вы не хотите учитывать подход кодирования k64 в base64 ):LC_ALL=C
: символы являются байтами$mapfile[file.gnp]
: содержимоеfile.gnp
файлаs::
: разбить строку на составляющие ее байтаOa
: перевернутьO
rder наa
Rray, индексировать этот массивисточник
zsh
это не единственная оболочка, которая может обрабатывать двоичные данные.Вот один из способов обращения двоичного файла с помощью
ksh93
. Я оставил код "свободным", чтобы его было легче понять.источник
read
выше не должно ничего читать, как это делается в конце файла.strace
и,ksh93
кажется, ведет себя очень странно, когда он ищет в файле все места и читает в больших количествах в то время. Может быть, вариант github.com/att/ast/issues/15strace
сценарий, чтобы понять, что я имею в виду.ksh93
читает файлы тысячи раз. Например, перед чтением первого байта он ищет 64 КБ в конце файла, читает 64 КБ, затем ищет перед последним байтом, читает 1 байт и делает что-то подобное для каждого байта. Обратите внимание, что то, что вы можете делать с этими закодированными строками base64, ограничено, поэтому, если вы читаете более одного байта за раз, будет сложнее извлечь отдельные байты этого.С perl:
Тест производительности:
Результат:
perl -0777 -F
самое медленное.xxd
самое медленное.Примечание: время выполнения
diff
должно быть одинаковым для всех решений, поскольку выходные данные должны быть одинаковыми.источник
perl
. Я не знал, что в то времяreverse
можно было переворачивать и строки, поэтому выполнение этого разделения не имело особого смысла, и ваша версия стала намного лучше.Я попробовал следующее:
Идея состоит в том, чтобы заставить 'tac' использовать любой символ в качестве разделителя. Я попробовал это на двоичном файле, и это, казалось, работало, но любое подтверждение будет оценено.
Основным преимуществом является то, что он не загружает файл в память.
источник
tac
8.28), когда ввод содержит символы новой строки.printf '1\n2' | tac -rs . | od -vAn -tc
выходы\n 2 1
вместо2 \n 1
. Вам также понадобятсяLC_ALL=C
или.
могут совпадать многобайтовые символы.LC_ALL=C tac -rs $'.\\|\n'
кажется, работает, хотя.