次のコマンドを使用した後、
pngString="$(cat example.png)"
echo -n "$pngString" > tmp.png
Tmp.pngをPNGファイルとして開くことができません。 $pngString
を使用して画像ファイルを保存すると、一部の情報が失われる可能性があります。
だから問題は:bashスクリプトの変数を使用して完全な画像情報を保存するにはどうすればよいですか?
echo
のとおりであり、会社はバイナリをうまく処理していないようです。ヌル文字がストリームを早めに壊してしまうのではないかと思います。
ASCIIベースの形式で画像情報を変換できます。たとえば、これはbase64
:
$ pic=`base64 pic.jpeg`
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0
問題は、nullバイトは内部的に引数ターミネーターとして使用されるため、コマンドライン引数を介して渡すことができないことです。他のすべてのバイトは問題ないようです。そのため、base64
を使用するよりも多少スペース効率のよい(通常は)代わりに、nullバイトをエスケープし、printf
を使用してデータを元の形式に変換します。
pngString="$(sed 's/\\/\\\\/g;s/%/%%/g;s/\x00/\\x00/g' <example.png)"
printf "$pngString" >tmp.png
\
および%
文字はprintf
に固有であるため、エスケープする必要があります。
また、入力データが改行で終わっている場合は、コマンド置換によって削除されます。有効なPNGの最後のバイトは0x82、つまり空のIEND
チャンクのCRC合計の最下位バイトであるため、これは特にPNGの問題ではありません。