После того, как я использую следующую команду,
pngString="$(cat example.png)"
echo -n "$pngString" > tmp.png
Я не могу открыть tmp.png как файл PNG. Может быть, некоторая информация теряется, когда я использую $pngString
для хранения файла изображения.
Итак, вопрос: как я могу сохранить полную информацию об изображении, используя переменную в скрипте bash?
cat
иecho
все это в душе текстовые утилиты. Если они будут ничего не подозревать о двоичных файлах, это приведет к непредсказуемым результатам. Вот почему такие вещиbase64
были изобретены.cat example.png > tmp.png
или еще лучшеcp example.png tmp.png
?cat
самом деле не текстовая утилита. Это подстановка команды (которая удаляет завершающие символы новой строки), присваивание переменной (которая не может содержать нулевые байты) иecho
команда (которая может интерпретировать последовательности с обратной косой чертой), которая будет искажать двоичный файл, а неcat
. Но я согласен с вашей общей точкой зрения.Ответы:
Вы правы в этом,
echo
и компания, кажется, плохо справляется с бинарным. Я подозреваю, что нулевые символы прерывают поток слишком рано.Вы можете преобразовать информацию об изображении в некоторый формат на основе ASCII. Например, это с
base64
:источник
echo "$pic" | base64 --decode > pic2.jpeg
Проблема в том, что нулевые байты не могут быть переданы через аргументы командной строки, поскольку они используются внутри в качестве ограничителей аргументов. Все остальные байты вроде бы в порядке. Таким образом, несколько более экономичной (обычно) альтернативой использованию
base64
будет экранирование нулевых байтов, а затем использованиеprintf
для преобразования данных в исходную форму:\
И%
символы имеют специальное значение,printf
поэтому они должны быть экранированы тоже.Также обратите внимание, что если входные данные заканчиваются символом новой строки, они будут удалены путем подстановки команд. Это не должно быть проблемой конкретно для PNG, так как последний байт в допустимом PNG должен быть 0x82, наименее значимый байт в
IEND
сумме CRC пустого фрагмента.источник
sed s/\\\\/\\\\\\\\/g\;s/%/%%/g\;s/\\x00/\\\\x00/g