Skip to content

Python:struct

패킹 된 바이너리 데이터로 바이트열을 해석

바이트 순서, 크기 및 정렬

기본적으로 C 유형은 시스템의 기본 형식과 바이트 순서로 표시되며 필요한 경우 (C 컴파일러에서 사용하는 규칙에 따라) 패드 바이트를 건너뛰어 적절하게 정렬됩니다. 이 동작은 압축된 구조체의 바이트가 해당 C 구조체의 메모리 레이아웃과 정확히 일치하도록 선택됩니다. 기본 바이트 순서 및 패딩을 사용할지 또는 표준 형식을 사용할지는 애플리케이션에 따라 다릅니다.

또는, 다음 표에 따라, 포맷 문자열의 첫 번째 문자를 사용하여 패킹 된 데이터의 바이트 순서, 크기 및 정렬을 표시할 수 있습니다:

문자

바이트 순서

크기

정렬

@

네이티브

네이티브

네이티브

=

네이티브

표준

none

<

리틀 엔디안

표준

none

>

빅 엔디안

표준

none

!

네트워크 (= 빅 엔디안)

표준

none

첫 번째 문자가 이들 중 하나가 아니면, '@'로 가정합니다.

포맷 문자

포맷 문자는 다음과 같은 의미가 있습니다; C와 파이썬 값 사이의 변환은 형을 주면 분명해야 합니다. ‘표준 크기’ 열은 표준 크기를 사용할 때 패킹 된 값의 크기를 바이트 단위로 나타냅니다; 즉, 포맷 문자열이 '<', '>', '!' 또는 '=' 중 하나로 시작하는 경우입니다. 네이티브 크기를 사용할 때, 패킹 된 값의 크기는 플랫폼에 따라 다릅니다.

포맷

C형

파이썬 형

표준 크기

노트

x

패드 바이트

값이 없습니다

-

(7)

c

char

길이가 1인 bytes

1

-

b

signed char

정수

1

(1), (2)

B

unsigned char

정수

1

(2)

?

_Bool

bool

1

(1)

h

short

정수

2

(2)

H

unsigned short

정수

2

(2)

i

int

정수

4

(2)

I

unsigned int

정수

4

(2)

l

long

정수

4

(2)

L

unsigned long

정수

4

(2)

q

long long

정수

8

(2)

Q

unsigned long long

정수

8

(2)

n

ssize_t

정수

-

(3)

N

size_t

정수

-

(3)

e

(6)

float

2

(4)

f

float

float

4

(4)

d

double

float

8

(4)

s

char[]

bytes

-

(9)

p

char[]

bytes

-

(8)

P

void*

정수

-

(5)

Integer를 Bytes로 직렬화

data = 9999
serialized_data = data.to_bytes(4, "big", signed=False)
print(serialized_data.hex())  ## 0000270f
result = int.from_bytes(serialized_data, "big", signed=False)
print(result)  ## 9999

위 코드를 Python:struct 을 사용한 방식으로 변환하면:

from struct import calcsize, pack, unpack

data = 9999
serialized_data = pack('>I', data)
print(serialized_data.hex())  ## 0000270f
unpacked_data = unpack('>I', serialized_data)
assert isinstance(unpacked_data, tuple)
assert len(unpacked_data) == 1
result = unpacked_data[0]
print(result)  ## 9999
print(calcsize('>I'))  ## 4

See also

Favorite site