Shell-Script
如何將 JPG 文件編碼/解碼為 int 序列?
我想將我的 JPG 文件轉換為
int
序列,然後重新轉換以再次獲取圖像。我
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
。問題是:如何從我的文件開始再次獲取圖像
sai.out
文件?
POSIXly:
od -An -vtu1 < file > file.encoded
其中文件的每個
v
字節都被編碼為一個u
無符號十進制數,帶有n
地址A
。要解碼,使用一些
awk
實現(喜歡gawk
或工作的mawk
地方printf("%c", 0)
):awk '{for (i = 1; i <= NF; i++) printf "%c", $i}' < file.encoded > file
關於為什麼您的方法行不通的幾點說明:
zsh
除了不能在其變數中儲存任意數據(尤其是 NUL 字節)之外的shell 。- 和類似 Bourne 的 shell 中的命令替換會去除尾隨換行符(大多數係統上為 0xa 字節)
- 您需要在類似 Bourne 的 shell 中引用變數,而不是
zsh
${var:offset:length}
ksh93
在具有運算符 (ksh93
,bash
,zsh
,mksh
)的 shell 中,以字元數offset
而length
不是字節數表示(UTF-8 是唯一支持mksh
且僅在utf8-mode
啟用該選項時才支持的多字節字元編碼)。printf %d \'x
返回字元的程式碼點編號。這只是單字節字元集中的字節值。在這裡,您可能正在使用bash
並且處於使用 UTF-8 編碼的語言環境中,因為bash
’printf
會為不構成有效字元一部分的字節提供隨機值。- text 被定義為文本行序列,它們本身是非 NUL字元序列(因此僅限於形成有效字元的字節序列),其長度(包括換行符在內的字節數)不超過
LINE_MAX
(參見getconf LINE_MAX
)並由換行符。因此,除了非常小的 jpg 文件之外,您sai.out
最終將不是有效文本,並且您無法保證文本實用程序可以正常處理它(od
這裡每行只輸出幾個數字)。