이진 시퀀스를 위해서 사용되는 내장 자료형은 bytes와 bytearray가 있고, bytes 형은 파이썬 3에서 소개된 불변형이고, bytearra는 파이썬 2.6에 추가된 가변형이다.
bytes와 bytearray에 들어 있는 각 항목은 0에서 255 사이의 정수로, 파이썬 2의 str에 들어 있는 문자 하나로 구성된 문자열과 다르지만 이진 시퀀스를 슬라이싱하면 언제나 동일한 자료형의 이진 시퀀스가 만들어지며, 슬라이스 길이가 1일 떼도 마찬가지다.
#bytes,bytearray로 저장된 5바이트 시퀀스
cafe = byte('cafe', encoding='utf_8')
cafe # b'caf\xc3\xa9'
cafe[0] #99
cafe[:1] # b'c'
cafe_arr = bytearray(cafe)
cafe_arr #bytearray(b'caf\xc3\xa9')
cafe_arr[-1:]#bytearray(b'\xa9')
"""
my_bytes[0]은 int 형을 반환하지만, my_bytes[:1]은 길이가 1인 bytes 객체를 반환하는 사실이 놀랍지 않고, s[0] ==s[:1]이 되는 시퀀스형은 str이 유일하다.
"""
이진 시퀀스가 실제로 정수형의 시퀀스이지만 리터럴 표기법을 보면 실제로 아스키 텍스트가 들어가는 경우
화면에 출력 가능한 아스키 문자(공백에서 물결표(~)까지)는 아스키 문자 그대로 출력한다.
탭,개행 문자, 캐리지 리턴, 백슬래시는 이스케이프 시퀀스로 출력한다.
그 외의 값은 널 바이트를 나타내는 \x00처럼 16진수 이스케이프 시퀀스로 출력한다.
bytes와 bytearray는 포매팅하는 format()과 format_map() 메서드를 제외하고 str이 제공하는 메서드를 모두 지원하며, casefold(), isdecimal(), isidentifier(), isnumeric(), isprintable(), encode() 등 유니코드 데이터에 관련된 메서드를 지원한다.
endswith(), replace(), strip(), translate(), upper()등의 메서드를 str이 아닌 bytes 인수에도 적용할 수 있고, str 대신 이진 시퀀스로 정규 표현식을 컴파일하먄 re 모듈에서 제공하는 정규 표현식 함수를 이진 시퀀스에도 적용할 수 있다.
#fromhex()라는 str에 없는 클래스 메서드도 제공하고, 이용하면 공백으로 구분된 16진수 쌍을 파싱
bytes.fromhex('31 4B CE A9')
#b'1K\xce\xa9'
struct 모듈은 패킹된 바이트를 다양한 형의 필드로 구성된 튜플로 분석하고, 튜플을 패킹된 바이트로 변환하는 함수를 제공하기에 struct는 bytes, bytearray, memoryview 객체와 함께 사용된다.
import struct
fmt = '<3s3sHH'
with open('filter.gif', 'rb') as fp:
img = memoryview(fp.read())
header = img[:10]
bytes(header) #b'GIF89a+\x02\xe6\x00'
struct.unpack(fmt, header) # (b'GIF', b'89a',555,230)
del header
del img
memoryview를 슬라이싱하면 바이트를 복사하지 않고 새로은 memoryview 객체를 반환함에 주의해야 하고, 이진 데이터를 사용하면 내장 자료형>>메모리 뷰 부분과 struct-bytes를 패킹된 이진 데이터로 해석하기를 공부해야할 필요가 있다.