Depois de usar o seguinte comando,
pngString="$(cat example.png)"
echo -n "$pngString" > tmp.png
Não consigo abrir o tmp.png como um arquivo PNG. Talvez algumas informações sejam perdidas quando eu uso $pngString
para armazenar o arquivo de imagem.
Portanto, a pergunta é: como posso armazenar as informações completas da imagem usando uma variável no script bash?
cat
eecho
todos os seus tipos estão no coração utilitários de texto . Soltá-los sem querer em arquivos binários terá resultados imprevisíveis. É por isso que coisas comobase64
foram inventadas.cat example.png > tmp.png
ou melhor aindacp example.png tmp.png
?cat
não é realmente um utilitário de texto. É a substituição de comando (que retira as novas linhas à direita), a atribuição de variável (que não pode conter bytes nulos) e oecho
comando (que pode interpretar as seqüências de barra invertida) que manipularão o binário, nãocat
. Mas eu concordo com o seu ponto de vista geral.Respostas:
Você está certo nisso
echo
e a empresa não parece lidar bem com o binário. Suspeito que os caracteres nulos interrompam o fluxo muito cedo.Você pode converter informações de imagem em algum formato baseado em ASCII. Por exemplo, isso é com
base64
:fonte
echo "$pic" | base64 --decode > pic2.jpeg
O problema é que bytes nulos não podem ser transmitidos através de argumentos de linha de comando, pois são usados internamente como terminadores de argumento. Todos os outros bytes parecem estar bem. Portanto, uma alternativa um pouco mais eficiente em termos de espaço (normalmente) ao uso
base64
seria escapar dos bytes nulos e depois usáprintf
- los para converter os dados na forma original:Os caracteres
\
e%
são especiais,printf
então eles precisam ser escapados também.Observe também que, se os dados de entrada terminarem com uma nova linha, eles serão removidos pela substituição de comandos. Isso não deve ser um problema específico para PNGs, pois o último byte em um PNG válido deve ser 0x82, o byte menos significativo na
IEND
soma do CRC do bloco vazio .fonte
sed s/\\\\/\\\\\\\\/g\;s/%/%%/g\;s/\\x00/\\\\x00/g