Après avoir utilisé la commande suivante,
pngString="$(cat example.png)"
echo -n "$pngString" > tmp.png
Je ne peux pas ouvrir le tmp.png en tant que fichier PNG. Peut-être que certaines informations sont perdues lorsque j'utilise $pngString
pour stocker le fichier image.
La question est donc: comment puis-je stocker les informations d'image complètes en utilisant une variable dans le script bash?
cat
etecho
et tous ses semblables sont au cœur des utilitaires de texte . Les laisser se perdre sans méfiance sur les fichiers binaires aura des résultats imprévisibles. C'est pourquoi des choses commebase64
ont été inventées.cat example.png > tmp.png
ou mieux encorecp example.png tmp.png
?cat
n'est pas vraiment un utilitaire de texte. C'est la substitution de commande (qui supprime les sauts de ligne de fin), l'affectation de variable (qui ne peut pas contenir d'octets nuls) et laecho
commande (qui peut interpréter les séquences de barre oblique inverse) qui gèreront le binaire, noncat
. Mais je suis d'accord avec votre point global.Réponses:
Vous avez raison
echo
et la société ne semble pas bien gérer le binaire. Je soupçonne que les caractères nuls interrompent le flux trop tôt.Vous pouvez convertir les informations d'image dans un format basé sur ASCII. Par exemple, c'est avec
base64
:la source
echo "$pic" | base64 --decode > pic2.jpeg
Le problème est que les octets nuls ne peuvent pas être passés via les arguments de ligne de commande car ils sont utilisés en interne comme terminateurs d'argument. Tous les autres octets semblent corrects. Ainsi, une alternative un peu plus économe en espace (généralement) à l'utilisation
base64
serait d'échapper les octets nuls, puis d'utiliserprintf
pour convertir les données au format d'origine:Les caractères
\
et%
sont spécifiques àprintf
donc ils doivent également être échappés.Notez également que si les données d'entrée se terminent par une nouvelle ligne, elles seront supprimées par substitution de commande. Cela ne devrait pas être un problème spécifique pour les PNG car le dernier octet dans un PNG valide doit être 0x82, l'octet le moins significatif dans la
IEND
somme CRC du bloc vide .la source
sed s/\\\\/\\\\\\\\/g\;s/%/%%/g\;s/\\x00/\\\\x00/g