본문 바로가기
프로그래밍/파이썬 라이브러리

[파이썬 라이브러리] 1. Base16, Base32, Base64, Base85 장단점 비교(예제코드 포함)

by it-수다쟁이증후군 2023. 4. 14.

Q1. 나)
Base16, Base32, Base64, Base85 장단점 비교

"표준라이브러리-base64"문장을 타이포그라피로 만든 썸네일

A1.ssam)

  • Base16, Base32, Base64, 및 Base85 는
  • 데이터를 다른 형식으로 인코딩하기 위한 방법입니다.
  • 주요 목적은 이진 데이터를 문자열 형태로 변환하여
  • 전송이나 저장에 더 적합하게 만드는 것입니다..

1) Base16 (Hexadecimal) : Base16 인코딩은 16개의 문자를 사용합니다. 0부터 9까지의 숫자와 A부터 F까지의 알파벳 대문자를 사용하여 이진 데이터를 표현합니다. 16진수로도 알려진 이 방식은 각 바이트를 두 개의 16진수 문자로 나타냅니다.

    장점 :
  1. 간단하고 이해하기 쉽습니다.
  2. 16진수는 바이트를 2자리 문자열로 직접 변환하기 때문에 디버깅이 쉽습니다.
  3. 문자열이 짧고, 컴퓨터에서 처리하기 쉬운 형태의 숫자를 사용합니다.
    단점 :
  1. 인코딩된 데이터는 원본 데이터보다 2배 큽니다.
  2. 저장 공간과 전송 시간이 증가하게 됩니다.

2) Base32 : Base32 인코딩은 32개의 문자를 사용합니다. 일반적으로 대문자 알파벳 A부터 Z까지와 숫자 2부터 7까지로 구성됩니다. 이 인코딩 방식은 5비트 이진 데이터를 하나의 문자로 표현합니다.

    장점 :
  1. Base16보다 약간 더 많은 데이터를 압축 가능.
  2. 무작위로 생성된 문자열에 대한 오류 검출이 가능합니다.
  3. 대소문자를 구별하지 않기 때문에, 인간이 읽고 쓰기 쉽습니다.
  4. Base64보다 덜 복잡한 문자 집합을 사용하여 인코딩 오류의 가능성이 낮습니다.
  5. QR 코드와 같은 인쇄 매체에 적합합니다.
    단점 :
  1. Base16에 비해 암호화 수준이 낮습니다.
  2. 인코딩된 데이터는 원본 데이터보다 약 60% 큽니다. 이는 저장 공간과 전송 시간이 증가하게 됩니다.
  3. Base64보다 전송 효율이 낮습니다.

3) Base64 : Base64 인코딩은 64개의 문자를 사용합니다. 대문자 알파벳 A부터 Z까지, 소문자 알파벳 a부터 z까지, 숫자 0부터 9까지, 그리고 추가로 두 개의 특수 문자(+, / 또는 -와 _)로 구성됩니다. 이 인코딩 방식은 6비트 이진 데이터를 하나의 문자로 표현합니다.

    장점 :
  1. 인코딩된 데이터는 원본 데이터보다 약 33% 크기 증가합니다. 이는 상대적으로 높은 효율성을 제공합니다.
  2. 대부분의 전자 메일 시스템에서 사용되는 인코딩 방식으로 널리 사용되고 지원됩니다.
  3. 대부분의 프로그래밍 언어와 시스템에서 지원되는 표준 라이브러리를 사용할 수 있습니다.
    단점 :
  1. Base16, Base32에 비해 암호화 수준이 낮습니다.
  2. 대소문자를 구별하기 때문에, 인간이 읽고 쓰기에 덜 친숙할 수 있습니다.
  3. 인코딩된 문자열에 특수 문자(+, /)가 포함되어 있어, URL에 사용하기에는 적합하지 않습니다.

4) Base85 (ASCII85) : Base85 인코딩은 85개의 문자를 사용합니다. 대부분의 경우 인쇄 가능한 ASCII 문자들 중 일부를 사용합니다. 이 인코딩 방식은 5비트 이진 데이터를 하나의 문자로 표현하는 Base32와 달리, 4바이트 이진 데이터를 5개의 ASCII 문자로 표현합니다.

    장점 :
  1. 인코딩된 데이터는 원본 데이터보다 약 25% 크기 증가합니다.
  2. Base64보다 더 높은 효율성을 제공합니다.
  3. 대부분의 프린터블 ASCII 문자를 사용하기 때문에, 인간이 읽고 쓰기에 상대적으로 쉽습니다.
    단점 :
  1. Base64에 비해 암호화 수준이 높지 않습니다.
  2. Base64에 비해 적용되는 곳이 적습니다. .
  3. 인코딩 및 디코딩 과정이 Base64보다 복잡합니다. 이로 인해 처리 속도가 느려질 수 있습니다.
  4. 인코딩된 문자열에 특수 문자를 포함할 수 있어, URL에 사용하기에는 적합하지 않습니다.

요약하자면, 각 인코딩 방식은 특정 상황에 적합한 장단점을 가지고 있습니다.

  • Base16은 디버깅이 쉽고 간단한 문자열로 이루어져 있지만, 인코딩 효율이 가장 낮습니다.
  • Base32는 인간이 읽고 쓰기에 친숙하고 QR 코드 등 인쇄 매체에 적합하지만, 전송 효율이 Base64보다 낮습니다.
  • Base64는 상대적으로 높은 인코딩 효율을 제공하며, 널리 사용되고 지원되지만, 인간이 읽고 쓰기에 덜 친숙하고 URL에 사용하기에 적합하지 않습니다.
  • Base85는 높은 인코딩 효율을 제공하지만, 처리 속도가 느릴 수 있으며, 널리 사용되지 않고 복잡한 인코딩 및 디코딩 과정을 가지고 있습니다.

따라서, 선택하는 인코딩 방식은 사용 사례와 요구 사항에 따라 결정됩니다. 예를 들어, 전송 효율성이 중요한 경우 Base64 또는 Base85를 선택할 수 있지만, 인간이 읽고 쓰기에 친숙한 것이 중요한 경우 Base32를 선택할 수 있습니다.

Q2. 나)
ase64 라이브러리가 많이 쓰이는 이유

A2.ssam)
간단합니다. 적당해서입니다. 인코딩 후 데이터가 커지지만 받아 들일수 있는 수준이고, 바이너리 데이터(이미지 파일, 사운드 파일 등)이기 때문에 암호화 수준이 그렇게 높지 됩니다. 무엇보다 다양한 프로그래밍 언어와 시스템에서 지원되는 표준라이브러리가 존재하거든요.

Q3. 나)
Base64 라이브러리의 예제코드

A3.ssam)
Python의 base64 라이브러리를 사용합니다.

1) 문자열 인코딩 (Encoding):

import base64

# 원본 데이터 (문자열)
original_data = "Hello, world!"

# 문자열을 바이트로 변환
data_bytes = original_data.encode("utf-8")

# Base64 인코딩
encoded_data = base64.b64encode(data_bytes)

# 인코딩된 데이터를 문자열로 변환
encoded_data_str = encoded_data.decode("utf-8")

print(f"원본 데이터: {original_data}")
print(f"Base64 인코딩된 데이터: {encoded_data_str}")

2) 인코딩문자열을 디코딩 (Decoding):

import base64

# 인코딩된 데이터 (문자열)
encoded_data_str = "SGVsbG8sIHdvcmxkIQ=="

# 문자열을 바이트로 변환
encoded_data_bytes = encoded_data_str.encode("utf-8")

# Base64 디코딩
decoded_data = base64.b64decode(encoded_data_bytes)

# 디코딩된 데이터를 문자열로 변환
decoded_data_str = decoded_data.decode("utf-8")

print(f"인코딩된 데이터: {encoded_data_str}")
print(f"디코딩된 데이터: {decoded_data_str}")

이 예제 코드에서는 base64.b64encode() 함수를 사용하여 데이터를 Base64로 인코딩하고, base64.b64decode() 함수를 사용하여 인코딩 된 데이터를 원래 형식으로 디코딩합니다. 데이터를 문자열과 바이트 간에 변환하기 위해 encode()decode() 메서드를 사용합니다.

3) 이미지 파일을 Base64로 인코딩하기:

import base64

# 이미지 파일을 바이너리 모드로 읽기
with open("example_image.jpg", "rb") as image_file:
    image_data = image_file.read()

# 이미지 데이터를 Base64로 인코딩
encoded_image_data = base64.b64encode(image_data)

# 인코딩된 이미지 데이터를 문자열로 변환 (옵션)
encoded_image_str = encoded_image_data.decode("utf-8")

# 인코딩된 이미지 데이터를 파일로 저장하기 (옵션)
with open("encoded_image.txt", "w") as encoded_image_file:
    encoded_image_file.write(encoded_image_str)

4) Base64로 인코딩 된 이미지 파일을 디코딩하기:

import base64

# 인코딩된 이미지 데이터를 파일에서 읽기 (옵션)
with open("encoded_image.txt", "r") as encoded_image_file:
    encoded_image_str = encoded_image_file.read()

# 인코딩된 이미지 데이터를 바이트로 변환 (옵션)
encoded_image_data = encoded_image_str.encode("utf-8")

# 인코딩된 이미지 데이터를 디코딩
decoded_image_data = base64.b64decode(encoded_image_data)

# 디코딩된 이미지 데이터를 파일로 저장
with open("decoded_image.jpg", "wb") as decoded_image_file:
    decoded_image_file.write(decoded_image_data)

이 예제에서는 이미지 파일을 바이너리 모드로 읽어 들인 후, base64.b64encode() 함수를 사용하여 이미지 데이터를 Base64로 인코딩합니다. 이어서 인코딩 된 이미지 데이터를 문자열로 변환하고 파일로 저장할 수 있습니다.

디코딩 작업에서는 인코딩된 이미지 데이터를 파일에서 읽어 들이고, 바이트로 변환한 후, base64.b64decode() 함수를 사용하여 이미지 데이터를 디코딩합니다. 마지막으로 디코딩된 이미지 데이터를 파일로 저장합니다.

음성 파일의 경우에도 같은 방법으로 작업을 수행할 수 있으며, 파일 확장자만 .jpg 대신 적절한 음성 파일 확장자로 변경하면 됩니다.

Q4. 나)
근본질문) 바이너리 데이터를 문자열로 인코딩하는 해야 하나?

A4.ssam)
일반적인 상황에서 이미지나 음악 파일을 문자열로 인코딩하지 않고, 원래의 바이너리 형식을 유지하는 것이 더 효율적입니다. 이는 인코딩 과정에서 파일 크기가 증가하고, 디코딩 과정에서 추가적인 처리 시간이 필요하기 때문입니다. 따라서 문자열로 인코딩하는 것은 특정 상황에 한정하여 사용하는 것이 좋습니다.

Q5. 나)
Base64 인코딩을 사용하는 상황(이메일/웹/데이터베이스/JSON)

A5.ssam)

  1. 이메일 전송: 이메일은 텍스트 기반의 프로토콜을 사용하므로, 바이너리 파일(예: 이미지, 동영상, 문서 등)을 첨부하여 전송하기 위해서는 Base64 인코딩을 사용하여 문자열로 변환해야 합니다.
  2. 웹에서 데이터 전송: 웹 상에서 이미지나 음악 파일 등의 바이너리 데이터를 전송할 때, Base64 인코딩을 사용하여 데이터 손실이나 호환성 문제를 방지할 수 있습니다. 예를 들어, 이미지 파일을 웹 페이지의 HTML 코드에 직접 삽입하려면 Data URI 형식을 사용하여 해당 이미지를 Base64로 인코딩하여 문자열로 변환해야 합니다.
  3. 데이터베이스 저장: 바이너리 데이터를 텍스트 기반의 데이터베이스에 저장할 때, Base64 인코딩을 사용하여 데이터를 문자열로 변환하면 데이터 저장과 관리가 용이해집니다.
  4. JSON 형식의 데이터 교환: JSON은 텍스트 기반의 데이터 교환 형식으로, 바이너리 데이터를 직접 표현할 수 없습니다. 따라서 JSON 형식으로 바이너리 데이터를 교환하려면 Base64 인코딩을 사용하여 문자열로 변환해야 합니다.

단, Base64 인코딩은 원본 데이터 크기를 약 33% 증가시키므로, 대용량의 데이터를 처리할 때는 주의해야 합니다. 또한, 인코딩과 디코딩 과정에서 추가적인 처리 시간이 필요하므로, 성능이 중요한 경우에는 다른 방식을 고려하는 것이 좋습니다.

1. 같이 보면 좋은 기초문법

 

[파이썬 문법] 8. 파일입출력 기초 총정리(3단계 작업,9종류파일 기본입출력)

오늘.ssam) 파이썬 파일입출력은 3단계로 나눌수 있습니다. 열고->작업(읽기/쓰기)->닫고 쉽죠. 어려운점은 어떤파일을 작업할것이냐 입니다. 왜 냐면 그 파일의 데이터 구조를 알아야 하고, 그 특

it-plus.tistory.com

2. 같이 보면 좋은 기초문법

 

[파이썬 문법] 9. 예외처리(Errors and Exceptions) 기초 총정리

오늘.ssam) 드디어 예외처리 까지 오게 되었습니다. 마지막 까지 화이팅입니다. Q1.나) 파이썬에서 예외 처리의 개념과 사용법 에 코드예시로 알려주세요 A1.ssam) 파이썬에서 예외 처리는 프로그램

it-plus.tistory.com

댓글