왜 이런 일이 발생하고 해결 방법을 아는 사람이 있습니까?
me@box:~$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ" | base64 -di
{"foo":"bar","baz":"bat"}base64: invalid input
답변1
반대로 하면 문자열이 불완전하다는 것을 알 수 있습니다.
$ echo '{"foo":"bar","baz":"bat"}' | base64
eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=
$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=" | base64 -di
{"foo":"bar","baz":"bat"}
발췌입력 길이를 3으로 나눌 수 없는 경우 base64 인코딩에 패딩이 필요한 이유는 무엇입니까?
필러 문자란 무엇입니까?
패딩 문자는 길이 요구 사항을 충족하는 데 도움이 되지만 의미는 없습니다.
그러나 패딩은 매우 간단한 네트워크 프로토콜에서 발생할 수 있는 것처럼 Base64로 인코딩된 문자열이 개별 시퀀스의 길이가 손실되는 방식으로 연결되는 상황에서 유용합니다.
채워지지 않은 문자열을 연결하면 각 개별 시퀀스의 끝 부분에 있는 홀수 바이트에 대한 정보가 손실되므로 원본 데이터를 복구할 수 없습니다. 그러나 패딩 시퀀스를 사용하면 모호함이 없어 전체 시퀀스를 정확하게 디코딩할 수 있다.
답변2
명령줄 도구는 입력 길이가 4의 배수가 되도록 적절한 패딩 문자 수를 선택합니다. 문자열의 길이는 34자이므로 =
끝에 패딩으로 두 개의 기호가 있어야 합니다.
$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ==" | base64 -di; echo
{"foo":"bar","baz":"bat"}
입력에 패딩 문자가 누락된 경우 결과는 구현에 따라 다릅니다. 올바른 Base64 인코딩 abcd
은 다음과 같습니다 YWJjZA==
.
% echo -n abcd |base64
YWJjZA==
패딩 문자를 제거한 상태에서 디코딩을 시도하면 마지막 부분은 다음과 같습니다.조용히 떨어지다Mac의 경우:
% echo 'YWJjZA' |base64 -d
abc
GNU 구현을 사용하면 전체 출력이 표시되지만 stderr에 오류 메시지가 표시됩니다.
$ echo 'YWJjZA' |base64 -d
abcdbase64: invalid input
답변3
GNU에서는 base64 -d
적절한 패딩이 필요합니다(입력 길이는 4의 배수여야 함). 다른 base64
디코더는 더 똑똑할 수 있으며 패딩이 필요하지 않습니다(예: Mac/BSD는 base64 -D
패딩이 필요하지 않습니다).
다음은 문자열을 자동으로 올바르게 채우는 bash 명령입니다 base64
. 이렇게 하면 "잘못된 입력" 오류가 발생하지 않습니다.
str="eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ"
echo "$str"==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 --decode
설명하다:
echo "$str"====
등호 4개를 추가하세요.fold -w 4
4자마다 별도의 줄로 분할sed '$ d'
마지막 행 제거(관련 없는 패딩)tr -d '\n'
모든 행을 연결