34. bytes, bytearray
1. 키워드
2. bytes
, bytearray
사용하기
- 파이썬에서 바이너리 데이터를 처리할 때는
bytes
와 bytearray
를 사용한다.
1) bytes
bytes
는 1바이트 단위의 값을 연속적으로 저장하는 시퀀스 자료형이다.
- 보통 1바이트는 8비트로 정의하며 0255(0x000xFF)까지의 정수를 사용한다.
bytes
로 바이트 객체를 만드는 방법은 다음과 같이 3가지가 있다.
bytes(길이) # 정해진 길이만큼 0으로 채워진 바이트 객체를 생성
bytes(반복가능한객체) # 반복 가능한 객체로 바이트 객체를 생성
bytes(바이트객체) # 바이트 객체로 바이트 객체를 생성
>>> bytes(10) # 0이 10개 들어있는 바이트 객체 생성
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> bytes([10, 20, 30, 40, 50]) # 리스트로 바이트 객체 생성
b'\n\x14\x1e(2'
>>> bytes(b"hello") # 바이트 객체로 바이트 객체 생성
b'hello'
- 파이썬에서
b"hello"
처럼 ' '
(작은따옴표)나 " "
(큰따옴표) 앞에 b
를 붙이면 바이트 객체가 된다.
2) bytearray
bytearray
도 1바이트 단위의 값을 연속적으로 저장하는 시퀀스 자료형인데, bytes
와의 차이점은 요소를 변경할 수 있느냐의 차이이다.
bytes
는 요소를 변경할 수 없고, bytearray
는 요소를 변경할 수 있다.
bytearray() # 빈 바이트 배열 객체를 생성
bytearray(길이) # 정해진 길이만큼 0으로 채워진 바이트 배열 객체를 생성
bytearray(반복가능한객체) # 반복 가능한 객체로 바이트 배열 객체를 생성
bytearray(바이트객체) # 바이트 객체로 바이트 배열 객체를 생성
- 다음은 바이트 배열 객체의 첫 번째 요소를 변경한다.
>>> x = bytearray(b"hello")
>>> x[0] = ord("a") # ord는 문자의 ASCII 코드를 반환
>>> x
bytearray(b'aello')
bytearray
의 요소에 값을 할당할 때는 정수(int
)를 할당해야 한다.
- 문자를 넣고 싶으면
ord
를 사용하여 문자의 ASCII 코드를 넣어주어야 한다.
3) 바이트 자료형과 인코딩
- 파이썬에서 문자열(
str
)의 기본 인코딩은 UTF-8인데, b"hello"
와 같이 문자열을 바이트 객체로 만들면 각 문자를 ASCII 코드로 저장한다.
- 보통 문자열을 UTF-8이 아닌 ASCII 코드로 처리하고 싶을 때 바이트 객체를 사용한다.
- 문자열(
str
)을 바이트 객체로 바꾸려면 encode
메서드를 사용한다.
>>> "hello".encode() # str을 bytes로 변환
b'hello'
- 이때 인코딩을 지정해 주면 해당 인코딩으로 된 바이트 객체를 만든다.
>>> "안녕".encode("euc-kr")
b'\xbe\xc8\xb3\xe7'
>>> "안녕".encode("utf-8")
b'\xec\x95\x88\xeb\x85\x95'
- 반대로 바이트 객체를 문자열(
str
)로 바꾸려면 decode
메서드를 사용하면 된다.
>>> b"hello".decode() # bytes를 str으로 변환
'hello'
- 물론 바이트 객체가 특정 인코딩으로 되어 있다면
decode
에 인코딩을 지정해 주면 된다.
>>> x = "안녕".encode("euc-kr")
>>> x.decode("euc-kr")
'안녕'
>>> y = "안녕".encode("utf-8")
>>> y.decode("utf-8")
'안녕'
bytes
, bytearray
는 인코딩을 지정하여 객체를 생성할 수 있다.
bytes(값, encoding="인코딩")
bytearray(값, encoding="인코딩")
- 다음은 한글 문자열
"안녕"
을 EUC-KR, CP949 인코딩으로 된 바이트 객체로 생성한다.
>>> bytes("안녕", encoding="euc-kr")
b'\xbe\xc8\xb3\xe7'
>>> bytearray("안녕", encoding="cp949")
bytearray(b'\xbe\xc8\xb3\xe7')
References