Setelah saya menggunakan perintah berikut,
pngString="$(cat example.png)"
echo -n "$pngString" > tmp.png
Saya tidak bisa membuka tmp.png sebagai file PNG. Mungkin beberapa informasi hilang ketika saya gunakan $pngString
untuk menyimpan file gambar.
Jadi pertanyaannya adalah: Bagaimana saya bisa menyimpan informasi gambar lengkap menggunakan variabel dalam skrip bash?
cat
danecho
dan semua sejenisnya adalah utilitas teks hati . Membiarkannya lepas tanpa curiga pada file biner akan memiliki hasil yang tidak terduga. Itu sebabnya hal-hal sepertibase64
diciptakan.cat example.png > tmp.png
atau lebih baikcp example.png tmp.png
,?cat
sebenarnya bukan utilitas teks. Ini adalah substitusi perintah (yang menghapus baris baru), penugasan variabel (yang tidak dapat berisi byte nol) danecho
perintah (yang dapat menginterpretasikan urutan backslash) yang akan memotong-motong biner, bukancat
. Tapi saya setuju dengan poin keseluruhan Anda.Jawaban:
Anda benar dalam hal itu
echo
& perusahaan sepertinya tidak menangani biner dengan baik. Saya menduga bahwa karakter nol memecah aliran terlalu dini.Anda dapat mengonversi informasi gambar dalam beberapa format berbasis ASCII. Misalnya, ini dengan
base64
:sumber
echo "$pic" | base64 --decode > pic2.jpeg
Masalahnya adalah bahwa byte nol tidak dapat melewati argumen baris perintah karena mereka digunakan secara internal sebagai terminator argumen. Semua byte lain tampaknya baik-baik saja. Jadi alternatif yang agak lebih hemat-ruang (biasanya) untuk menggunakan
base64
adalah untuk menghindari byte nol dan kemudian menggunakanprintf
untuk mengkonversi data ke bentuk asli:The
\
dan%
karakter khusus untukprintf
sehingga mereka harus melarikan diri juga.Juga perhatikan bahwa jika data input diakhiri dengan baris baru, itu akan dilucuti oleh substitusi perintah. Itu seharusnya tidak menjadi masalah khusus untuk PNG karena byte terakhir dalam PNG yang valid harus 0x82, byte paling signifikan dalam
IEND
jumlah CRC potongan kosong .sumber
sed s/\\\\/\\\\\\\\/g\;s/%/%%/g\;s/\\x00/\\\\x00/g