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行に数個の数字のみが出力されます)。