CentOS 7에서 바이너리 파일을 base64로 인코딩하는 올바른 방법은 무엇입니까?

CentOS 7에서 바이너리 파일을 base64로 인코딩하는 올바른 방법은 무엇입니까?

저는 bash 쉘과 함께 CentOS 7을 사용하고 있습니다. 나는 바이너리 파일을 base64로 인코딩하는 것이 다음과 같이 간단할 것이라고 생각했습니다.

[rails@server lib]$ cat mybinary.file | base64 > /tmp/output.base64

하지만 파일 길이를 보면 4의 배수가 아닌 것을 알 수 있습니다.

[rails@server lib]$ ls -al /tmp/output.base64 
-rw-rw-r-- 1 rails rails 92935 May 31 15:50 /tmp/output.base64

내가 한 일이 유효한지 아닌지는 모르겠지만 JS 라이브러리로 파일을 디코딩하려고 하면 문자열 길이가 4의 배수가 아니라는 사실에 대해 불평하는 오류가 발생하므로 위에서 제가 한 일이 맞는지, 아니면 다른 방법이 있는지 궁금합니다.

답변1

$ echo foo |base64 
Zm9vCg==
$ echo foo |base64 |wc -c
9

의 출력에서 ​​후행 개행 문자에 주목하세요 base64. 여기서는 9번째 문자입니다.

더 긴 입력의 경우 기본적으로 76자마다 출력을 래핑하므로 두 줄 이상을 생성합니다. 를 사용 base64 -w0하거나 를 통해 출력을 파이핑하여 래핑(최종 개행 포함)을 비활성화할 수 있습니다 tr -d '\n'.

답변2

base64적당히 긴 문자열에 대해 여러 줄을 작성하므로 파일 크기에서 올바른 개행 수를 빼야 합니다. 일부 시스템에서는 유틸리티가 DOS 텍스트 파일을 작성할 수 있습니다( base64GNU coreutils가 아니라 다음 구현을 사용).네밀랩BSD 시스템에서 일반적임), 이 경우 인코딩된 문자열의 길이를 얻으려면 한 줄에 2바이트를 빼야 합니다.


댓글 질문에 대한 응답: "새 선취권이나 기타 쓰레기 없이 원시 base64 문자열을 어떻게 얻습니까? base64 문자열만 얻을 수 있습니까?"

base6476자는 MIME 인코딩된 텍스트 줄의 최대 길이이기 때문에 76번째 문자마다 줄바꿈을 삽입합니다(그리고 기본 64는 이메일용 기본 64 콘텐츠 전송 인코딩을 만드는 데 가장 일반적으로 사용됩니다).

이러한 줄 바꿈을 제거하려면 다음을 수행하십시오.

base64 filename | tr -d '\n\r' >outfilename

GNU coreutils를 사용 하면 base64다음을 사용할 수 있습니다.

base64 -w0 filename >outfilename

답변3

매뉴얼에 따르면:

SYNOPSIS
       base64 [OPTION]... [FILE]

DESCRIPTION
       Base64 encode or decode FILE, or standard input, to standard output.

       With no FILE, or when FILE is -, read standard input.

당신이 하고 있는 일이 옳은 것처럼 들리지만, 나는 쓸모없는 의 사용을 유도하기보다는 와 cat같은 것을 제안 하고 싶습니다 base64 file > file.b64.

관련 정보