Python 2.7 및 3.x 에서 바이트를 정수로 변환하는 방법

Jinku Hu 2023년10월10일
  1. 파이썬 2.7 바이트 데이터 타입
  2. 파이썬 3 바이트 데이터 타입
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 데이터 유형이 없습니다. 키워드 bytestr 과 동일합니다.

>>> bytes is str
True

bytearraybytes 또는 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 는 두 부분으로 구성됩니다.

  1. >는 이진 데이터가 big-endian임을 나타내거나 데이터가 빅 엔드 (가장 중요한 비트)에서 정렬됨을 나타냅니다. 예를 들어,\x00\0x1\x00 이 높은 바이트이고\x01 이 낮은 바이트임을 의미합니다.
  2. 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()형식 바이트 순서 정의와 유사합니다.

정보
바이트 표현은 ** 1 ** 정수로 변환됩니다

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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - Python Bytes