binascii — 바이너리와 ASCII 간 변환
binascii — 바이너리와 ASCII 간 변환
binascii 모듈은 바이너리와 다양한 ASCII 인코딩 바이너리 표현 사이를 변환하는 여러 메서드를 담고 있어요. 보통 이런 함수를 직접 쓰진 않고 base64 같은 래퍼 모듈을 사용해요. binascii 모듈은 더 빠른 속도를 위해 C로 작성된 저수준 함수를 담고 있고, 고수준 모듈들이 이 함수를 사용해요.
참고:
a2b_*함수는 ASCII 문자만 포함한 유니코드 문자열을 받아들이고, 다른 함수들은 bytes-like 객체(bytes,bytearray등 버퍼 프로토콜을 지원하는 객체)만 받아들여요. (3.3부터 a2b_* 함수가 ASCII 전용 유니코드 문자열을 수용)
본문
함수
binascii.a2b_uu(string): uuencode 데이터 한 줄을 바이너리로 되돌려 바이너리 데이터를 반환. 줄은 보통 45(바이너리) 바이트를 담고, 마지막 줄은 예외. 줄 데이터 뒤에 공백이 올 수 있어요.binascii.b2a_uu(data, *, backtick=False): 바이너리 데이터를 ASCII 문자 줄로 변환. 반환값은 변환된 줄로 개행 문자를 포함. data 길이는 최대 45.backtick이 true면 0을 공백 대신 '`'로 표현. (3.7에서 backtick 매개변수 추가)binascii.a2b_base64(string, /, *, strict_mode=False): base64 데이터 블록을 바이너리로 변환. 한 번에 여러 줄 가능.strict_mode가 true면 유효한 base64 데이터만 변환되고 유효하지 않으면binascii.Error. 유효한 base64: RFC 3548 준수, base64 알파벳 문자만 포함, 패딩 이후 여분 데이터 없음(초과 패딩·개행 포함), 패딩으로 시작하지 않음. (3.11에서 strict_mode 추가)binascii.b2a_base64(data, *, newline=True): 바이너리 데이터를 base64 코딩의 ASCII 문자 줄로 변환.newline이 true면 개행 문자 포함. 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에 따라 밑줄로 인코딩, false면 개행도 인코딩(아니면 줄바꿈 변환이 바이너리 데이터 스트림을 손상시킬 수 있음).binascii.crc_hqx(data, value):value를 초기 CRC로 시작해 data의 16비트 CRC 값을 계산해 반환. CRC-CCITT 다항식 x16 + x12 + x5 + 1 (보통 0x1021로 표현)을 사용. binhex4 형식에 사용되는 CRC.binascii.crc32(data[, value]): CRC-32, 즉 data의 부호 없는 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(...): 바이너리 데이터의 16진수 표현을 반환. data의 각 바이트가 2자리 hex 표현으로 변환되므로 반환 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에서 sep와 bytes_per_sep 추가)
binascii.a2b_hex(hexstr)/binascii.unhexlify(hexstr): hex 문자열hexstr이 나타내는 바이너리 데이터를 반환.b2a_hex()의 역함수. hexstr은 짝수 개의 16진수 자릿수(대소문자 무관)를 포함해야 하고, 아니면Error예외 발생.bytes.fromhex()클래스 메서드로도 비슷한 기능(공백에 더 관대)에 접근 가능.
예외
exception binascii.Error: 오류 시 발생. 보통 프로그래밍 오류.exception binascii.Incomplete: 불완전한 데이터에서 발생. 보통 프로그래밍 오류는 아니고, 데이터를 조금 더 읽고 다시 시도하면 처리할 수 있어요.
참고: base64 모듈(16, 32, 64, 85진 base64 스타일 인코딩 지원), quopri 모듈(MIME 이메일 메시지의 quoted-printable 인코딩 지원)도 함께 보세요.