Python에서
bytes
와bytearray
는
binary data를 byte 단위 (1byte = 8bit)로 다루는데
사용되는 Data Type임.
bytes
:
bytes
는 immutable byte sequence 로서 일종의 byte로 구성된tuple
에 해당 함.byte literal
은 다음과 같이b
라는 prefix를 사용함.b'Hello'
은'Hello'
라는 문자열에 대한byte literal
을 의미함.- 문자열에 대한 bytes 이므로 encoding이 사용되며 기본으로
utf8
이 사용됨. byte literal
과 같이 추후 변경이 되지 않는 binary data를 위한 데이터 타입이bytes
임.
bytes
객체를 출력할 경우,utf8
인 경우에는 ascii에 해당하는 바이트는 ascii 문자로 출력되고- ascii에 해당하지 않는 1바이트는 hex sequence 로 표현함 (backslash
\
와x
를 통해 hex, 16진법을 사용함을 표시하고, 2개의 숫자로 1byte를 표현) utf16
등의 encoding을 사용한 경우에는- hex sequence로 표현된다.
다음의 코드와 출력 결과를 위의 설명과 함께 참고할 것.
s = 'Hello'
b = s.encode('utf8')
print(type(b), b)
print(b'Hello' == b)
b = s.encode('utf16')
print(type(b), b)
결과는 다음과 같음.
<class 'bytes'> b'Hello'
True
b'Hello'
<class 'bytes'> b'\xff\xfeH\x00e\x00l\x00l\x00o\x00'
literal 용어가 익숙치 않다면 다음을 참고.
https://dsaint31.tistory.com/462
[Basic] Literal
소스 코드 상에서 고정된 값을 가르킴. (또는 고정된 값을 나타내는 표기법을 의미함.) Programming language에서 data의 값을 지정(specifying data values)하는 방법은 다음 중의 하나임. Literal을 사용. Variable
dsaint31.tistory.com
bytearray
:
bytearray
는 mutable byte sequence 로서 일종의 byte로 구성된list
임.bytearray(b'Hello')
를 통해'Hello'
의 utf8 인코딩에 해당하는bytes
객체를 기준으로bytearray
로 변환.
- 해당
bytesarray
는 변경가능함.arr = bytearray(b'Hello')
를 수행하고arr[0] = b'J'
와 같은 코드를 수행하면arr
은b'Jello'
로 변경됨.
참고할 것.
Python에서 디코딩은 특정 인코딩방식에 따라 bytes
를 str
로 변경하는 것을 의미하고, 인코딩은 str
로부터 bytes
를 얻어내는 것을 가르킴.
기본적으로는 utf8
을 사용함.
str
객체의 경우encode
메서드를 통해 encoding방식에 따른bytes
를 얻을 수 있음 (기본은utf8
이나ascii
나utf16
등을 지정가능함).bytes
또는bytearray
객체는decode
메서드를 통해 특정 encoding 방식에 따른 해당하는str
을 얻을 수 있음.- 만약 decoding시 적용하는 encoding 방식에 지정되지 않은 바이트값이 있는 경우, 에러가 발생함.
errors='ignore'
을 인자로 주면 에러를 무시하고 변환.
다음 예를 참고할 것.
np_c = bytes([128])
np_c_str = np_c.decode('ascii',errors='ignore')
np_c1 = bytes([129])
np_c1_str = np_c.decode('ascii',errors='ignore')
with open('bin2txt.txt', 'wb') as f:
f.write('a'.encode('ascii'))
f.write(np_c)
f.write(np_c1)
f.write('b'.encode('ascii'))
null_c = bytes([0])
null_str = null_c.decode('ascii', errors='ignore')
# encoding에 정의되지 않은 bytes들은 text 에서 일종의 빈 문자 등으로 처리해버림.
# decode에서 errors='strict' 로 주어질 경우 아예 decode가 되지 않게도 할 수 있으나,
# 많은 앱에선 일종의 null처럼 처리해버림. (단 null과 같진 않은 경우가 대부분.)
print(f"[{np_c_str}], [{np_c1_str}], {np_c_str == np_c1_str}")
print(f"[{np_c_str}], [{null_str}], {np_c_str == null_str}")
결과는 다음과 같음.
[], [], True
[], [], False
같이 읽어보면 좋은 URLs
2024.01.15 - [Python] - [python] Text mode vs. Binary mode: File open
[python] Text mode vs. Binary mode: File open
Python에서 특정 파일을 open하는 경우, text mode 또는 binary mode 중 하나로 열게 된다. 이 둘의 차이점은 간단히 설명하면, 현재 open하고자 하는 file을 text파일로 처리할지 아니면 binary파일로 처리할지
ds31x.tistory.com
https://dsaint31.me/mkdocs_site/CE/ch01/code_for_character/#encodings-for-unicode
BME228
Codes for Characters Code란 특정 형태의 inforamtion을 다른 방법으로 표현하는 규칙 또는 해당 규칙으로 표현된 결과물을 가르킴. 문자를 나타내기 위한 code는 인간이 사용하는 문자를 일종의 기호 또는
dsaint31.me
'Python' 카테고리의 다른 글
[Python] Binary Operations (0) | 2024.01.15 |
---|---|
[Python] `struct` 사용하기: bytes 로 C언어 구조체 다루기. (1) | 2024.01.15 |
[python] Text mode vs. Binary mode: File open (0) | 2024.01.15 |
[pandas] 데이터 타입에 따른 column 추출 (0) | 2024.01.12 |
[pandas] merge 예제. (0) | 2024.01.12 |