![CentOS 7에서 Base64로 바이너리 파일을 인코딩하는 올바른 방법은 무엇입니까?](https://linux55.com/image/134418/CentOS%207%EC%97%90%EC%84%9C%20Base64%EB%A1%9C%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%9D%B8%EC%BD%94%EB%94%A9%ED%95%98%EB%8A%94%20%EC%98%AC%EB%B0%94%EB%A5%B8%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 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 텍스트 파일에 쓸 수 있습니다( base64
GNU coreutils를 사용하지 않고 GNU coreutils의 구현을 사용함).포미 연구소(BSD 시스템에서 일반적임), 이 경우 인코딩된 문자열의 길이를 얻으려면 한 줄에 2바이트를 빼야 합니다.
댓글의 질문에 답하려면 "새 선취권이나 기타 쓰레기 없이 원시 Base64 문자열을 어떻게 얻나요? Base64 문자열만 얻을 수 있나요?"
base64
76자는 MIME 인코딩 텍스트 줄의 최대 길이이기 때문에(그리고 Base 64는 전자 메일 메시지에 대한 Base 64 콘텐츠 전송 인코딩을 만드는 데 가장 일반적으로 사용됨) 76자마다 줄 바꿈이 삽입됩니다.
이러한 개행 문자를 제거하려면 다음을 수행하십시오.
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
.