Skip to content

34. bytes, bytearray


1. 키워드

  • bytesbytearray


2. bytes, bytearray 사용하기

  • 파이썬에서 바이너리 데이터를 처리할 때는 bytesbytearray를 사용한다.


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 메서드를 사용한다.


문자열.encode()
>>> "hello".encode() # str을 bytes로 변환
b'hello'


  • 이때 인코딩을 지정해 주면 해당 인코딩으로 된 바이트 객체를 만든다.


문자열.encode("인코딩")
>>> "안녕".encode("euc-kr")
b'\xbe\xc8\xb3\xe7'
>>> "안녕".encode("utf-8")
b'\xec\x95\x88\xeb\x85\x95'


  • 반대로 바이트 객체를 문자열(str)로 바꾸려면 decode 메서드를 사용하면 된다.


바이트객체.decode()
>>> b"hello".decode() # bytes를 str으로 변환
'hello'


  • 물론 바이트 객체가 특정 인코딩으로 되어 있다면 decode에 인코딩을 지정해 주면 된다.


바이트객체.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