
int
JPGファイルをシーケンスに変換し、再変換して画像を再インポートしたいと思います。
私のscript.sh
ことです。
FILE=$(cat $2)
TOTAL=$(echo ${#FILE} - 1 | bc);
for j in $(seq 0 $TOTAL)
do
printf "%d " "'${FILE:j:1}" >> sai.out
done
明らかにうまくいくようです。だからsai.out
そのようなことを受けてください32767 32767 32767 32767 16 74 70 73 70 1 1 1 1 32767 32767 67 8 ...
。
同じコードを使用しますが、テキストファイルを入力すると、ASCIIテーブルを介して簡単にデコードして印刷できます%c
。
Q:私のsai.out
ファイルから画像ファイルをどのように再インポートできますか?
答え1
POSIX的に:
od -An -vtu1 < file > file.encoded
v
ファイルの各バイトは、u
アドレスを含む符号なし10進数でエンコードされます。n
A
デコードするには、いくつかのawk
実装(gawk
効率的なmawk
実装printf("%c", 0)
など)を使用してください。
awk '{for (i = 1; i <= NF; i++) printf "%c", $i}' < file.encoded > file
あなたのアプローチがうまくいかない理由に関するいくつかの注意:
- シェルは
zsh
変数に任意のデータ(特にNULバイト)を格納できません。 - Bourneなどのシェルのコマンド置換は、末尾の改行を削除します(ほとんどのシステムでは0xaバイト)。
- Bourneに似たシェルでは変数を引用する必要があります。
zsh
${var:offset:length}
ksh93
演算子(ksh93
、、、、)を持つシェルでは、バイト以外の文字数で表されます(ただしbash
、UTF-8はこのオプションが有効な場合にのみサポートされる唯一のマルチバイト文字エンコーディングです)。zsh
mksh
offset
length
mksh
utf8-mode
printf %d \'x
文字のコードポイント番号を返します。これは単一バイト文字セットのバイト値にすぎません。ここでは、bash
UTF-8エンコーディングをロケールとして使用している可能性があります。bash
printf
有効な文字の一部を形成しない任意のバイト値を提供します。。- テキストは一連のテキスト行として定義され、それ自体はNULではなく文字列のシーケンスです。数値(したがって有効な文字を形成するバイトシーケンスに制限されます)長さ(単位数)バイト改行を含む)は超えておらず
LINE_MAX
(参照getconf LINE_MAX
)、改行で区切られています。したがって、非常に小さなjpgファイルを除いて、sai.out
有効なテキストで終わらず、テキストユーティリティで正しく処理されるという保証もありません(od
ここでは1行に数個の数字のみが出力されます)。
答え2
hexが有効な整数表現の場合、xxdはその操作を実行します。
xxd -p image.jpg > image.hex
そして画像に戻すには、次の手順に従ってください。
xxd -p -r image.hex > image-copy.jpg
答え3
私の答えはArrowのヒントに基づいています。私はこれの専門家ではないsed
ので、これよりも良い解決策があると確信していますが、現時点では効果があります。
戦略は、私のファイルを16進数に変換しxxd
てから16進数を整数に変換することです。
コーディング:
xxd -p $1 | sed 's/.\{2\}/& /g' | sed 's/[^ ]* */0x&/g' | awk '{ for(i=1;i<=NF;i++) printf("%i ",$i); print ""; }' > $2
デコード:
awk '{ for(i=1;i<=NF;i++) printf("%02x ",$i); print ""; }' $IN > $OUT
xxd -p -r $OUT $OUT_IMAGE_NAME.jpg
rm $OUT