binascii — 이진과 ASCII 사이 변환

binascii — 이진과 ASCII 사이 변환 (Convert between binary and ASCII)

이진 표현과 다양한 ASCII 인코딩된 이진 표현 사이를 변환하는 여러 메서드를 담고 있는 모듈이에요. 보통 이런 함수를 직접 쓰기보다는 base64 같은 래퍼 모듈을 사용해요. binascii에는 더 빠른 속도를 위해 C로 작성된 저수준 함수가 담겨 있고, 그걸 상위 레벨 모듈이 사용해요.

출처: Python 표준 라이브러리

본문

binascii 모듈은 이진과 다양한 ASCII 인코딩된 이진 표현 사이를 변환하는 여러 메서드를 담고 있어요. 보통 이런 함수를 직접 사용하지는 않고 base64 같은 래퍼 모듈을 사용해요. binascii에는 더 빠른 속도를 위해 C로 작성된 저수준 함수가 담겨 있고, 상위 레벨 모듈이 그걸 사용해요.

참고: a2b_* 함수는 ASCII 문자만 포함한 유니코드 문자열도 받아들여요. 다른 함수는 bytes류 객체(bytes, bytearray 및 버퍼 프로토콜을 지원하는 다른 객체)만 받아들여요.

3.3 버전 변경: a2b_* 함수가 이제 ASCII 전용 유니코드 문자열도 받아들여요.

binascii 모듈은 다음 함수를 정의해요:

binascii.a2b_uu(string)

한 줄의 uuencoded 데이터를 이진으로 다시 변환하고 이진 데이터를 반환해요. 마지막 줄을 제외하고 줄은 보통 45(이진) 바이트를 담아요. 줄 데이터 뒤에는 공백이 올 수 있어요.

binascii.b2a_uu(data, *, backtick=False)

이진 데이터를 ASCII 문자 한 줄로 변환해요. 반환값은 변환된 줄이며, 새 줄 문자를 포함해요. data의 길이는 최대 45이어야 해요. backtickTrue면 0은 공백 대신 ''로 표현돼요. **3.7 버전 변경: backtick` 매개변수 추가.**

binascii.a2b_base64(string, /, *, strict_mode=False)

base64 데이터 블록을 이진으로 다시 변환하고 이진 데이터를 반환해요. 한 번에 여러 줄을 전달할 수 있어요. strict_modeTrue면 유효한 base64 데이터만 변환돼요. 잘못된 base64 데이터는 binascii.Error를 발생시켜요. 유효한 base64란:

  • RFC 3548을 준수하는 것.
  • base64 알파벳의 문자만 포함하는 것.
  • 패딩 뒤에 초과 데이터가 없는 것(초과 패딩, 새 줄 등 포함).
  • 패딩으로 시작하지 않는 것.

3.11 버전 변경: strict_mode 매개변수 추가.

binascii.b2a_base64(data, *, newline=True)

이진 데이터를 base64 코딩의 ASCII 문자 한 줄로 변환해요. 반환값은 변환된 줄이며, newlineTrue면 새 줄 문자를 포함해요. 이 함수의 출력은 RFC 3548을 준수해요. 3.6 버전 변경: newline 매개변수 추가.

binascii.a2b_qp(data, header=False)

quoted-printable 데이터 블록을 이진으로 다시 변환하고 이진 데이터를 반환해요. 한 번에 여러 줄을 전달할 수 있어요. 선택 인자 header가 존재하고 True면 밑줄은 공백으로 디코딩돼요.

binascii.b2a_qp(data, quotetabs=False, istext=True, header=False)

이진 데이터를 quoted-printable 인코딩의 ASCII 문자 한 줄(들)로 변환해요. 반환값은 변환된 줄(들)이에요. 선택 인자 quotetabs가 존재하고 True면 모든 탭과 공백이 인코딩돼요. 선택 인자 istext가 존재하고 True면 새 줄은 인코딩되지 않지만 끝의 공백은 인코딩돼요. 선택 인자 header가 존재하고 True면 RFC 1522에 따라 공백이 밑줄로 인코딩돼요. 선택 인자 header가 존재하고 False면 새 줄 문자도 인코딩돼요. 그렇지 않으면 줄바꿈 변환이 이진 데이터 스트림을 손상시킬 수 있어요.

binascii.crc_hqx(data, value)

value를 초기 CRC로 시작하여 data의 16비트 CRC 값을 계산하고 결과를 반환해요. 이는 CRC-CCITT 다항식 x16 + x12 + x5 + 1(종종 0x1021로 표현)을 사용해요. 이 CRC는 binhex4 형식에서 사용돼요.

binascii.crc32(data[, value])

CRC-32, 즉 초기 CRC가 valuedata의 부호 없는 32비트 체크섬을 계산해요. 기본 초기 CRC는 0이에요. 이 알고리즘은 ZIP 파일 체크섬과 일치해요. 이 알고리즘은 체크섬 알고리즘으로 사용되도록 설계됐기 때문에 일반 해시 알고리즘으로는 적합하지 않아요. 다음과 같이 사용하세요:

print(binascii.crc32(b"hello world"))
# Or, in two pieces:
crc = binascii.crc32(b"hello")
crc = binascii.crc32(b" world", crc)
print('crc32 = {:#010x}'.format(crc))

3.0 버전 변경: 결과는 항상 부호 없음.

binascii.b2a_hex(data[, sep[, bytes_per_sep=1]])

binascii.hexlify(data[, sep[, bytes_per_sep=1]])

이진 데이터의 16진수 표현을 반환해요. data의 각 바이트는 대응하는 2자리 16진수 표현으로 변환돼요. 따라서 반환되는 bytes 객체는 data 길이의 두 배예요. 텍스트 문자열을 반환하는 비슷한 기능은 bytes.hex() 메서드로 편리하게 접근할 수 있어요. sep가 지정되면 단일 문자 str 또는 bytes 객체여야 해요. 출력에서 bytes_per_sep 입력 바이트마다 삽입돼요. 구분자 배치는 기본적으로 출력의 오른쪽 끝에서부터 세어요. 왼쪽에서부터 세려면 음수 bytes_per_sep 값을 주세요.

>>> import binascii
>>> binascii.b2a_hex(b'\xb9\x01\xef')
b'b901ef'
>>> binascii.hexlify(b'\xb9\x01\xef', '-')
b'b9-01-ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b'_', 2)
b'b9_01ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b' ', -2)
b'b901 ef'

3.8 버전 변경: sepbytes_per_sep 매개변수가 추가됐어요.

binascii.a2b_hex(hexstr)

binascii.unhexlify(hexstr)

16진수 문자열 hexstr로 표현된 이진 데이터를 반환해요. 이 함수는 b2a_hex()의 역함수예요. hexstr은 짝수 개의 16진수 숫자(대문자나 소문자 모두 가능)를 포함해야 하며, 그렇지 않으면 Error 예외가 발생해요. 공백에 대해 더 관대한 비슷한 기능은 bytes.fromhex() 클래스 메서드로 접근할 수 있어요.

exception binascii.Error

오류 시 발생하는 예외예요. 보통 프로그래밍 오류예요.

exception binascii.Incomplete

불완전한 데이터에 대해 발생하는 예외예요. 보통 프로그래밍 오류는 아니고, 데이터를 조금 더 읽고 다시 시도하면 처리할 수 있어요.

더 알아보기

  • Module base64 — base 16, 32, 64, 85의 RFC 준수 base64 스타일 인코딩 지원.
  • Module quopri — MIME 이메일 메시지에서 사용되는 quoted-printable 인코딩 지원.