Shell-Script

如何將 JPG 文件編碼/解碼為 int 序列?

  • April 13, 2019

我想將我的 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 中,以字元數offsetlength不是字節數表示(UTF-8 是唯一支持mksh且僅在utf8-mode啟用該選項時才支持的多字節字元編碼)。
  • printf %d \'x返回字元的程式碼點編號。這只是單字節字元集中的字節值。在這裡,您可能正在使用bash並且處於使用 UTF-8 編碼的語言環境中,因為bashprintf會為不構成有效字元一部分的字節提供隨機值
  • text 被定義為文本行序列,它們本身是非 NUL字元序列(因此僅限於形成有效字元的字節序列),其長度(包括換行符在內的字節數)不超過LINE_MAX(參見getconf LINE_MAX)並由換行符。因此,除了非常小的 jpg 文件之外,您sai.out最終將不是有效文本,並且您無法保證文本實用程序可以正常處理它(od這裡每行只輸出幾個數字)。

引用自:https://unix.stackexchange.com/questions/392703