>

다음 명령을 사용한 후

pngString="$(cat example.png)"    
echo -n "$pngString" > tmp.png

PNG 파일을 PNG 파일로 열 수 없습니다. $pngString 를 사용할 때 일부 정보가 손실 될 수 있습니다  이미지 파일을 저장합니다.

그래서 질문은 : bash 스크립트에서 변수를 사용하여 완전한 이미지 정보를 어떻게 저장할 수 있습니까?

  • 답변 # 1

    당신은 그 echo 에 맞아  &회사는 바이너리를 잘 처리하지 못하는 것 같습니다. null 문자가 스트림을 너무 일찍 중단한다고 생각합니다.

    그림 정보를 일부 ASCII 기반 형식으로 변환 할 수 있습니다. 예를 들어, 이것은 base64 입니다 :

    $ pic=`base64 pic.jpeg`
    $ echo $pic | base64 --decode > pic2.jpeg
    $ diff pic*
    $ echo $?
    0
    
    

  • 답변 # 2

    문제는 널 바이트가 내부적으로 인수 종결 자로 사용되므로 명령 행 인수를 통해 널 바이트를 전달할 수 없다는 것입니다. 다른 모든 바이트는 괜찮은 것 같습니다. 따라서 base64 를 사용하는 것보다 다소 공간 효율적인 (일반적으로) 대안  null 바이트를 이스케이프 한 다음 printf 를 사용하는 것입니다.  데이터를 원래 형식으로 변환하려면 :

    pngString="$(sed 's/\\/\\\\/g;s/%/%%/g;s/\x00/\\x00/g' <example.png)"
    printf "$pngString" >tmp.png
    
    

    와이즈 비즈  그리고 \  문자는 % 에 특별합니다  그들도 탈출해야합니다.

    또한 입력 데이터가 줄 바꿈으로 끝나는 경우 명령 대체로 제거됩니다. 유효한 PNG의 마지막 바이트는 빈 printf 에서 가장 중요하지 않은 바이트 인 0x82이어야하므로 PNG에는 특별히 문제가되지 않습니다.  청크의 CRC 합계.

    IEND

관련 자료

  • 이전 bash - 호스트 테이블에서 사용 가능한 IP 주소를 확인하는 방법은 무엇입니까?
  • 다음 x11 - AltGr + 키를 심볼에 어떻게 바인딩합니까?