본문 바로가기

바이트와 바이트배열

'bytes'는 불변(immutable)한 바이트 시퀀스로 b'hello' 형태로 생성합니다. 'bytearray'는 가변(mutable)한 바이트 시퀀스로 요소 수정이 가능합니다. 파일 입출력, 네트워크 통신에서 바이너리 데이터 처리에 사용됩니다.

1. 바이트와 바이트 배열

파이썬에서 2진수 데이터를 처리할 때 주로 사용되는 데이터 유형은 바이트(bytes)와 바이트 배열(bytearray)입니다. 이 두 자료형은 바이너리 데이터를 효율적으로 다루기 위해 설계되었으며, 시퀀스 자료형의 특성을 가지고 있습니다.

1.1 바이트 (Bytes)

bytes 타입은 불변(immutable)한 바이트 시퀀스를 나타냅니다.

# 생성
example = b'hello'

# 인덱싱
print(example[0])  # 출력: 104 (아스키 코드로 'h')
print(example[1])  # 출력: 101 (아스키 코드로 'e')

# 슬라이싱
print(example[1:4])  # 출력: b'ell'

# 멤버 확인
print(b'h' in example)  # 출력: True

# 연결 및 반복
example2 = b' world'
print(example + example2)  # 출력: b'hello world'
print(example2 * 2)        # 출력: b' world world'

b'' 리터럴 안에는 아스키 문자만 적을 수 있습니다. 한글처럼 아스키 범위를 벗어나는 문자는 직접 적을 수 없습니다.

b = b'하하'  # SyntaxError 발생

그렇다고 한글을 바이트로 다룰 수 없다는 뜻은 아닙니다. 문자열의 encode() 메서드로 특정 인코딩 규칙에 따라 바이트로 바꿀 수 있고, 반대로 decode()로 되돌릴 수 있습니다.

b = '하하'.encode('utf-8')
print(b)          # b'\xed\x95\x98\xed\x95\x98'
print(len(b))     # 6, 한글 한 글자가 UTF-8에서 3바이트를 차지합니다.
print(len('하하')) # 2, 문자열의 길이는 글자 수입니다.

print(b.decode('utf-8'))  # 하하

즉 문자열은 사람이 읽는 글자의 나열이고, 바이트는 컴퓨터가 저장하고 전송하는 숫자의 나열입니다. 이 둘 사이를 오갈 때 어떤 인코딩을 쓸지 정해주는 것이 encode와 decode입니다. 인코딩을 잘못 지정하면 글자가 깨집니다.

b = '하하'.encode('utf-8')
print(b.decode('cp949', errors='replace'))  # 다른 규칙으로 읽으면 깨집니다.

1.2 바이트 배열 (Bytearray)

bytearray는 가변(mutable)한 바이트 시퀀스를 나타내며, bytes와 유사한 방식으로 사용됩니다.

# 생성
example = bytearray(b'hello')

# 인덱싱
print(example[0])  # 출력: 104 (아스키 코드로 'h')
print(example[1])  # 출력: 101 (아스키 코드로 'e')

# 슬라이싱
print(example[1:4])  # 출력: bytearray(b'ell')

# 멤버 확인
print(b'h' in example)  # 출력: True

# 연결 및 반복
example2 = bytearray(b' world')
print(example + example2)  # 출력: bytearray(b'hello world')
print(example2 * 2)        # 출력: bytearray(b' world world')

# 내장 함수
print(len(example))  # 출력: 5
print(min(example))  # 출력: 101 (아스키 코드로 'e')
print(max(example))  # 출력: 111 (아스키 코드로 'o')

# 가변성 활용
example[0] = 74  # 'h'를 'J'로 변경
print(example)   # 출력: bytearray(b'Jello')

1.3 바이트와 바이트 배열의 활용

bytes와 bytearray는 파일 입출력, 네트워크 통신, 바이너리 데이터 처리 등 다양한 상황에서 사용됩니다. 바이트 배열은 바이트 시퀀스의 내용을 변경할 수 있어, 동적인 바이너리 데이터 처리에 유용합니다.

바이트와 바이트배열 - 견고한 파이썬 | 위니버시티