Python 2.7 및 3.x 에서 바이트를 정수로 변환하는 방법
Bytes
데이터 타입의 값은 0에서 255 (0x00에서 0xFF) 사이입니다. 1 바이트에는 8 비트가 있으므로 최대 값은 0xFF 입니다. 경우에 따라 추가 데이터 처리를 위해 바이트 또는 바이트 배열을 정수로 변환해야합니다. 이 짧은 기사에서는 바이트를 정수로 변환하는 메소드 인 Python 2.7의 struct.unpack
메소드와 Python 3.x 의 int.from_bytes()
를 소개합니다.
파이썬 2.7 바이트 데이터 타입
Python 2.7 버전에는 내장 bytes
데이터 유형이 없습니다. 키워드 byte
는 str
과 동일합니다.
>>> bytes is str
True
bytearray
는 bytes
또는 byte array
객체를 정의하는 데 사용됩니다.
>>> byteExample1 = bytearray([1])
>>> byteExample1
bytearray(b'\x01')
>>> byteExample2 = bytearray([1,2,3])
>>> byteExample2
bytearray(b'\x01\x02\x03')
Python 2.7에서 바이트를 정수로 변환
파이썬 내부 모듈 struct
는 이진 데이터 (바이트)를 정수로 변환 할 수 있습니다. 파이썬 2.7에서 바이트 또는 실제로 문자열과 양방향 방식으로 정수를 변환 할 수 있습니다.
struct.unpack(fmt, string)
# Convert the string according to the given format `fmt` to integers. The result is a tuple even if there is only one item inside.
struct
예제
import struct
testBytes = b"\x00\x01\x00\x02"
testResult = struct.unpack(">HH", testBytes)
print testResult
(1, 2)
형식 문자열> HH
는 두 부분으로 구성됩니다.
>
는 이진 데이터가big-endian
임을 나타내거나 데이터가 빅 엔드 (가장 중요한 비트)에서 정렬됨을 나타냅니다. 예를 들어,\x00\0x1
은\x00
이 높은 바이트이고\x01
이 낮은 바이트임을 의미합니다.HH
는 바이트 문자열에H
유형의 두 객체가 있음을 의미합니다.H
는 2 바이트가 걸리는 부호없는 짧은 정수를 나타냅니다.
할당 된 데이터 형식이 다른 경우 동일한 문자열에서 다른 결과를 얻을 수 있습니다.
>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)
여기서<
는 엔디안이 little-endian
임을 나타냅니다. 따라서\x00 \ x01
은 더 이상 0 * 256 + 1 = 1
이 아니라 00 + 1 * 256 = 256
이됩니다.
>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)
B
는 데이터가 1 바이트를받는 ‘부호없는 char’임을 의미합니다. 따라서\x00 \ x01 \ x00 \ x02
는 더 이상 ‘부호없는 short’의 2 개 값이 아닌 ‘부호없는 char’의 4 개 값으로 변환됩니다.
>>> testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
error: unpack requires a string argument of length 3
struct
모듈의 공식 문서를 확인하여 format strings에 대한 자세한 정보를 얻을 수 있습니다.
파이썬 3 바이트 데이터 타입
bytes
는 Python 3에 내장 된 데이터 타입이므로 bytes
키워드를 사용하여 바이트를 직접 정의 할 수 있습니다.
>>> testByte = bytes(18)
>>> type(testByte)
<class 'bytes'>
아래와 같이 바이트 또는 바이트 배열을 직접 정의 할 수도 있습니다
>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)
<class 'bytes'>
Python 3에서 바이트를 정수로 변환
파이썬 2.7에서 이미 소개 된 struct
모듈 외에도, 새로운 Python 3 내장 정수 메소드를 사용하여 바이트에서 정수로 변환, 즉 int.from_bytes()
메소드를 수행 할 수도 있습니다.
int.from_bytes()
예제
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712
byteorder
옵션은 struct.unpack()
형식 바이트 순서 정의와 유사합니다.
int.from_bytes()
에는 정수형을 signed
또는 unsigned
로 지정할 수있는 세 번째 옵션 인 signed
가 있습니다.
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
- 3824
바이트가 ‘부호없는 문자’인 경우[]
사용
데이터 형식에 1 바이트 만 포함하는 ‘부호없는 char’형식이있는 경우, 객체 인덱스를 사용하여 직접 데이터 정수를 얻을 수 있습니다.
>>> testBytes = b'\xF1\x10'
>>> testBytes[0]
241
>>> testBytes[1]
16
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook