Bir görüntü dosyası bash değişkeninde nasıl saklanır?


14

Aşağıdaki komutu kullandıktan sonra,

pngString="$(cat example.png)"    
echo -n "$pngString" > tmp.png

Tmp.png dosyasını PNG dosyası olarak açamıyorum. $pngStringResim dosyasını saklamak için kullandığımda bazı bilgiler kaybolur .

Yani soru şu: Bash komut dosyasında bir değişkeni kullanarak tüm görüntü bilgilerini nasıl saklayabilirim?


Cat komutu iyi çalışıyor (görüntü verilerini değişkente saklamak için). Sadece çift tırnak işaretlerini kaldırın. Soru, değişkene kaydettikten sonra bu verilerle ne yapmak istediğinizdir?
coffeMug

5
catve echotüm ilkeleri kalp metni yardımcı programlarındadır. İkili dosyalarda hiç şüphesiz kaybolmalarını sağlamak beklenmedik sonuçlar doğuracaktır. Bu yüzden böyle şeyler base64icat edildi.
Shadur

Neden bir değişken olarak olmasını istersiniz? Kabuk değişkenleri genellikle büyük miktarlarda ikili veriyi değil, az miktarda metin depolamayı amaçlar. Her zamanki kabuğun hiçbiri zsh dışında değişkenlerdeki ikili verilerle (boş baytlarda boğulma) başa çıkamaz.
Gilles 'SO- kötü olmayı bırak'

Neden henüz cat example.png > tmp.pngya da daha iyisi değil cp example.png tmp.png?
Joker

@Shadur, catgerçekten bir metin yardımcı programı değil. Komut ikamesi (izleyen satırsonlarını kesen), değişken ataması (boş bayt içeremeyen) ve echoikiliyi değiştirmeyecek komut (ters eğik çizgi dizilerini yorumlayabilir) cat. Ama genel görüşünüze katılıyorum.
Wildcard

Yanıtlar:


20

Sen haklısın echove şirket bu kadar iyi ikili işlemek görünmüyor. Boş karakterlerin akışı çok erken kırdığından şüpheleniyorum.

Resim bilgilerini bazı ASCII tabanlı formatlarda dönüştürebilirsiniz. Örneğin, şununla base64:

$ pic=`base64 pic.jpeg`
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0

3
Bash sistemimde, büyük olasılıkla base64 beyaz boşluk içerebileceğinden, değişkeni tırnak içine almak zorunda kaldım: echo "$pic" | base64 --decode > pic2.jpeg
OldTimer

1

Sorun, boş baytların dahili olarak argüman sonlandırıcıları olarak kullanıldıkları için komut satırı argümanlarından geçirilememesidir. Diğer tüm baytlar iyi görünüyor. Bu nedenle, kullanım için biraz daha yer tasarrufu sağlayan (tipik olarak) bir alternatif base64, boş baytlardan kaçmak ve ardından printfverileri orijinal forma dönüştürmek için kullanmak olacaktır:

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

\Ve %karakterler için özeldir printfonlar da kaçtı gerekir böylece.

Ayrıca, giriş verileri bir satırsonu ile bitiyorsa, komut yerine koyma işlemiyle çıkacağını unutmayın. Geçerli bir PNG'deki son bayt, boş IENDyığının CRC toplamındaki en az önemli bayt olan 0x82 olması gerektiğinden, bu özellikle PNG'ler için bir sorun olmamalıdır .


1
Daha fazla ters eğik çizgi istiyorsanız, şunu kullanın: sed s/\\\\/\\\\\\\\/g\;s/%/%%/g\;s/\\x00/\\\\x00/g
Karel Vlk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.