리눅스2023. 8. 4. 18:17

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/611457

문자열에 대한 베이스64(base64) 인코딩/디코딩은 이전 게시물을 참고하자. 여기로

 

리눅스에서 base64를 이용해서 베이스64 인코딩을 할 때, 문자열이 짧을 경우에는 별 문제가 없다. 아래와 같이 인코딩 하면 된다.

# 문자열 abc를 베이스64 인코딩(echo에서 -n 옵션으로 줄바꿈 제외)
echo -n "abc" | base64
YWJj

문제는 문자열이 꽤 긴 경우에 결과를 변수에 저장해서 작업하는 경우다. 리눅스에서 베이스64 인코딩/디코딩을 해 주는 프로그램 base64에서 자동적으로 줄바꿈을 해서 출력을 여러줄로 만들기 때문이다.

# 긴 문자열에 대한 베이스64 인코딩 예시
echo "Hello. This is John speaking. May I speak to Jane please?" | base64
SGVsbG8uIFRoaXMgaXMgSm9obiBzcGVha2luZy4gTWF5IEkgc3BlYWsgdG8gSmFuZSBwbGVhc2U/
Cg==

위의 예시에 나온 결과를 입출력 리다이렉션(I/O redirection)으로 파일에 저장한다면 별 문제가 없을 것이나, 만약 길이가 긴 문자열을 베이스64 인코딩해서 이것을 변수에 할당해서 다른 작업에 활용해야 한다면 여러 줄로 출력되는 것을 한줄로 바꿀 필요가 있다.

base64 버전에 따라 줄바꿈 앞에 '/' 문자가 있는 경우도 있고 없는 경우도 있으므로, 시험 삼아 임의의 긴 문자열을 한번 인코딩해서 결과를 확인해 보자. 어쨌든 위의 예시에는 '/' 문자가 있는 경우다.

해결책은 간단하다. tr을 이용해서 줄바꿈을 공백으로 바꾼 후에, sed를 이용해서 바뀐 부분('/ ')을 제거하면 된다. tr과 sed의 조합은 이전 게시물을 참고하자. 여기로

 

# 긴 문자열에 대한 베이스64 인코딩. 출력을 한줄로
echo "Hello. This is John speaking. May I speak to Jane please?" | base64 | tr '\n' ' ' | sed 's/\/ //g'
SGVsbG8uIFRoaXMgaXMgSm9obiBzcGVha2luZy4gTWF5IEkgc3BlYWsgdG8gSmFuZSBwbGVhc2UCg==

# 베이스64 디코딩
echo "SGVsbG8uIFRoaXMgaXMgSm9obiBzcGVha2luZy4gTWF5IEkgc3BlYWsgdG8gSmFuZSBwbGVhc2UCg==" | base64 -d
Hello. This is John speaking. May I speak to Jane please?

 

728x90
Posted by 반달가면