IT 엘도라도 로고
IT 엘도라도
황금

Python bytes, bytearray, 인코딩 및 디코딩

2020-07-09 22:53

Python bytes, bytearray, 인코딩 및 디코딩

1. bytes, bytearray (바이트 배열 객체) - 왜 필요할까?

파이썬에는 바이트 배열을 나타내는 객체의 타입으로 bytes, bytearray가 존재한다. 즉 1바이트(= 8비트) 크기의 요소들로 이뤄진 리스트를 나타내는 타입인 것이다. 그렇다면 bytes, bytearray 타입의 바이트 배열 객체와 str 타입의 문자열 객체는 어떤 차이가 있을까? 이를 이해하기 위해서는 다음과 같은 절대적인 사실을 떠올릴 필요가 있다. 바로 "컴퓨터는 오로지 바이트 배열만 저장할 수 있다"는 것이다. 즉 컴퓨터에 무언가를 저장하려면 먼저 그것을 바이트 배열의 형태로 '인코딩(Encoding)'을 해야 한다. 다음은 음악 파일, 사진 파일, 문자 파일 등을 컴퓨터에 저장할 수 있는 바이트 배열의 형태로 인코딩을 하는 예시를 나타낸다. 여기서 MP3, WAV, PNG, JPG, ASCII, UTF-8은 모두 인코딩 방식의 한 종류라고 할 수 있다.
  • EX 1) 음악 파일을 저장하고 싶다면 먼저 그것을 MP3, WAV 등의 방식으로 인코딩을 해야 한다.
  • EX 2) 사진 파일을 저장하고 싶다면 먼저 그것을 PNG, JPG 등의 방식으로 인코딩을 해야 한다.
  • EX 3) 문자 파일을 저장하고 싶다면 먼저 그것을 ASCII, UTF-8 등의 방식으로 인코딩을 해야 한다.
즉, 인코딩이란 음악 파일, 사진 파일, 문자 파일 등을 컴퓨터에 저장할 수 있는 바이트 배열의 형태로 표현하기 위한 수단을 의미한다. 파이썬에서 bytes, bytearray 타입의 바이트 배열 객체는 그렇게 인코딩 된 결과에 해당하는 바이트 배열을 나타내기 위한 용도로 사용된다. 뒤에서 더 자세히 알아보겠지만, 문자열 객체를 컴퓨터에 저장하기 위한 바이트 배열 객체로 인코딩하고 이를 다시 디코딩하는 예시를 간단히 살펴보면 다음과 같다.
결국 인코딩과 디코딩은 서로 역 연산의 관계이다. 무엇이든지 간에 디스크에 저장되려면 먼저 인코딩이 이뤄져야 하고, 인간에 의해 읽히거나 사용되려면 먼저 디코딩이 이뤄져야 하는 것이다. 알고 보면 단순한 것이니 너무 어렵게 생각하지 말도록 하자.
 

2. bytes 객체의 이해

바이트 배열을 나타내는 객체의 타입으로, 각 요소를 변경할 수 없는 immutable 특성을 지닌다(튜플과 비슷).
bytes 객체는 다음과 같은 방법들을 통해 생성할 수 있다.
  • b'문자열 내용': 해당 문자열을 ASCII 방식으로 인코딩한 바이트 배열 객체를 생성
  • bytes(길이): 정해진 길이만큼의 0x00으로 채워진 바이트 배열 객체를 생성
  • bytes(반복 가능 객체): 반복 가능한 객체로 바이트 배열 객체를 생성
  • bytes(바이트 배열 객체): 바이트 배열 객체로 바이트 배열 객체를 생성
💡
참고로 파이썬이 bytes 객체를 콘솔에 출력해줄 때의 규칙은 다음과 같다.
  1. 출력 가능한 형태의 1바이트 ASCII 문자들은 그대로 출력한다.
  1. 그렇지 않은 나머지 경우에는 바이트의 값을 16진수의 형태(\x??)로 출력한다.
 

3. bytearray 객체의 이해

바이트 배열을 나타내는 객체의 타입으로, 각 요소를 변경할 수 있는 mutable 특성을 지닌다(리스트와 비슷).
bytearray 객체도 마찬가지로 다음과 같은 방법들을 통해 생성할 수 있다.
  • bytearray(길이): 정해진 길이만큼의 0x00으로 채워진 바이트 배열 객체를 생성
  • bytearray(반복 가능 객체): 반복 가능한 객체로 바이트 배열 객체를 생성
  • bytearray(바이트 배열 객체): 바이트 배열 객체로 바이트 배열 객체를 생성
bytearray 객체는 bytes 객체와 달리 다음과 같이 각 요소의 값을 변경할 수 있다. 단 요소의 값을 바꿀 때는 항상 정수(int) 값을 할당해야 한다는 것에 주의하자. 문자를 넣고 싶다면 파이썬의 내장 함수 ord()를 활용하여 아스키 코드 값을 넣어주도록 하자.
 

4. 인코딩 및 디코딩

 
 
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.
말풍선
댓글 0
좋아요 2
    아직 작성된 댓글이 없어요.
사용자