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.

질문은: 내 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, zsh, )가 있는 mksh쉘 에서는 바이트가 아닌 문자 수로 표현됩니다(그러나 UTF-8은 이 옵션이 활성화된 경우에만 지원되는 유일한 멀티바이트 문자 인코딩입니다 offset) .lengthmkshutf8-mode
  • printf %d \'x문자의 코드 포인트 번호를 반환합니다. 이는 단일 바이트 문자 집합의 바이트 값일 뿐입니다. 여기에서는 bashUTF-8 인코딩을 로케일로 사용하고 있을 수 있습니다.bashprintf유효한 문자의 일부를 형성하지 않는 임의의 바이트 값을 제공합니다 ..
  • 텍스트는 일련의 텍스트 줄로 정의되며 그 자체는 NUL이 아닌 문자열의 시퀀스입니다.수치(따라서 유효한 문자를 형성하는 바이트 시퀀스로 제한됨) 길이(단위 수)바이트줄 바꿈 포함)은 초과하지 않으며 LINE_MAX( 참조 getconf LINE_MAX) 줄 바꿈으로 구분됩니다. 따라서 매우 작은 jpg 파일을 제외하고는 sai.out유효한 텍스트로 끝나지 않으며 텍스트 유틸리티에서 제대로 처리된다는 보장도 없습니다( od여기에서는 한 줄에 몇 개의 숫자만 출력됩니다).

답변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

관련 정보