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
.
질문은: 내 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
,zsh
, )가 있는mksh
쉘 에서는 바이트가 아닌 문자 수로 표현됩니다(그러나 UTF-8은 이 옵션이 활성화된 경우에만 지원되는 유일한 멀티바이트 문자 인코딩입니다offset
) .length
mksh
utf8-mode
printf %d \'x
문자의 코드 포인트 번호를 반환합니다. 이는 단일 바이트 문자 집합의 바이트 값일 뿐입니다. 여기에서는bash
UTF-8 인코딩을 로케일로 사용하고 있을 수 있습니다.bash
printf
유효한 문자의 일부를 형성하지 않는 임의의 바이트 값을 제공합니다 ..- 텍스트는 일련의 텍스트 줄로 정의되며 그 자체는 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