Как сохранить файл изображения в переменной удара?

Посмотрите Настраивают меню Xfce на сайте XFCE.

14
29.12.2013, 16:22
2 ответа

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

Можно преобразовать информацию об изображении в некотором основанном на ASCII формате. Например, это с base64:

$ pic=`base64 pic.jpeg`
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0
20
27.01.2020, 19:51
  • 1
    В моей системе удара я должен был включить переменную в кавычки, вероятно, потому что base64 может содержать пробел: echo "$pic" | base64 --decode > pic2.jpeg –  OldTimer 01.01.2014, 01:54

Проблема в том, что нулевые байты не могут передаваться через аргументы командной строки, поскольку они используются внутри как терминаторы аргументов. Все остальные байты вроде в порядке. Таким образом, несколько более компактной (обычно) альтернативой использованию base64 было бы экранирование нулевых байтов, а затем использование printf для преобразования данных в исходную форму:

pngString="$(sed 's/\\/\\\\/g;s/%/%%/g;s/\x00/\\x00/g' <example.png)"
printf "$pngString" >tmp.png

\ и % символы являются специальными для printf , поэтому их тоже нужно экранировать.

Также обратите внимание, что если входные данные заканчиваются новой строкой, они будут удалены при подстановке команд. Это не должно быть проблемой специально для PNG, поскольку последний байт в допустимом PNG должен иметь значение 0x82, младший байт в сумме CRC пустого блока IEND .

1
27.01.2020, 19:51

Теги

Похожие вопросы