JPGファイルをintシーケンスにエンコード/デコードする方法は?

JPGファイルをintシーケンスにエンコード/デコードする方法は?

intJPGファイルをシーケンスに変換し、再変換して画像を再インポートしたいと思います。

私の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進数でエンコードされます。nA

デコードするには、いくつかの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はこのオプションが有効な場合にのみサポートされる唯一のマルチバイト文字エンコーディングです)。zshmkshoffsetlengthmkshutf8-mode
  • printf %d \'x文字のコードポイント番号を返します。これは単一バイト文字セットのバイト値にすぎません。ここでは、bashUTF-8エンコーディングをロケールとして使用している可能性があります。bashprintf有効な文字の一部を形成しない任意のバイト値を提供します。
  • テキストは一連のテキスト行として定義され、それ自体はNULではなく文字列のシーケンスです。数値(したがって有効な文字を形成するバイトシーケンスに制限されます)長さ(単位数)バイト改行を含む)は超えておらずLINE_MAX(参照getconf LINE_MAX)、改行で区切られています。したがって、非常に小さなjpgファイルを除いて、sai.out有効なテキストで終わらず、テキストユーティリティで正しく処理されるという保証もありません(odここでは1行に数個の数字のみが出力されます)。

おすすめ記事