바이트에 대한 기본 지식

매일 공부(ML)·2022년 11월 19일
0

Fluent Python

목록 보기
20/130

텍스트와 바이트

바이트에 대한 기본 지식

이진 시퀀스를 위해서 사용되는 내장 자료형은 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를 패킹된 이진 데이터로 해석하기를 공부해야할 필요가 있다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글