Nachdem ich den folgenden Befehl verwende,
pngString="$(cat example.png)"
echo -n "$pngString" > tmp.png
Ich kann die Datei tmp.png nicht als PNG-Datei öffnen. Möglicherweise gehen beim $pngString
Speichern der Bilddatei einige Informationen verloren .
Die Frage ist also: Wie kann ich die vollständigen Bildinformationen mit einer Variablen im Bash-Skript speichern?
cat
undecho
und alle seine ilk sind im Innersten Text - Utilities. Wenn Sie sie in Binärdateien ahnungslos verlieren, kann dies zu unvorhersehbaren Ergebnissen führen. Deshalb wurden solche Dingebase64
erfunden.cat example.png > tmp.png
oder noch bessercp example.png tmp.png
?cat
ist nicht wirklich ein Textdienstprogramm . Es ist die Befehlsersetzung (die nachfolgende Zeilenumbrüche entfernt), die Variablenzuweisung (die keine Null-Bytes enthaltenecho
darf ) und der Befehl (der möglicherweise Backslash-Sequenzen interpretiert), der die Binärdatei kaputt macht, nichtcat
. Aber ich stimme Ihrem allgemeinen Standpunkt zu.Antworten:
Sie haben Recht damit
echo
und die Firma scheint mit Binärdateien nicht so gut umzugehen. Ich vermute, dass die Nullzeichen den Stream zu früh unterbrechen.Sie können Bildinformationen in ein ASCII-basiertes Format konvertieren. Zum Beispiel ist dies mit
base64
:quelle
echo "$pic" | base64 --decode > pic2.jpeg
Das Problem besteht darin, dass Nullbytes nicht über Befehlszeilenargumente übergeben werden können, da sie intern als Argumentterminatoren verwendet werden. Alle anderen Bytes scheinen in Ordnung zu sein. Eine etwas platzsparendere (normalerweise) Alternative zur Verwendung
base64
wäre es, die Null-Bytes zu umgehen und dannprintf
die Daten in die ursprüngliche Form zu konvertieren:Die
\
und%
-Zeichen sind etwas Besonderes,printf
daher müssen sie auch maskiert werden.Beachten Sie auch, dass die Eingabedaten, wenn sie mit einem Zeilenumbruch enden, durch die Befehlsersetzung entfernt werden. Dies sollte kein spezielles Problem für PNGs sein, da das letzte Byte in einem gültigen PNG 0x82 sein sollte, das niedrigstwertige Byte in der
IEND
CRC-Summe des leeren Chunks.quelle
sed s/\\\\/\\\\\\\\/g\;s/%/%%/g\;s/\\x00/\\\\x00/g