검색하기귀찮아서만든블로그

[python] 구조체 (struct) 사용하기 본문

개발

[python] 구조체 (struct) 사용하기

hellworld 2022. 5. 18. 20:27
# -*- coding: utf-8 -*-
import struct
import ctypes

# 구조체 정의
class _ST_TEST(ctypes.Structure):
    _fields_ = [
        ("cVal", ctypes.c_char),
        ("byVal", ctypes.c_ubyte),
        ("sVal", ctypes.c_short),
        ("usVal", ctypes.c_ushort),
        ("nVal", ctypes.c_int),
        ("uVal", ctypes.c_uint),
        ("lVal", ctypes.c_long),
        ("ulVal", ctypes.c_ulong),
    ]

# 구조체 포맷 정의
_ST_TEST_FMT = '!c B h H i I l L'

# 스트럭처 데이터 생성
stSrc = struct.pack(_ST_TEST_FMT, bytes('A', "utf-8"), 255, 32767, 65535, 2147483647, 4294967295, 2147483647, 4294967295)

# 스트럭처 구조체 생성
stDst = _ST_TEST()

# 소스 구조체를 파싱하여 구조체 변수에 넣는다. (소켓으로 받은 데이터를 파싱할 때 활용할 수 있음.)
stDst.cVal, stDst. byVal, stDst.sVal, stDst.usVal, stDst.nVal, stDst.uVal, stDst.lVal, stDst.ulVal = struct.unpack(_ST_TEST_FMT, stSrc)

print('[parse result]\n - char val : {0}\n - byte val : {1}\n - short val : {2}\n - ushort val : {3}\n\
 - int val : {4}\n - uint val : {5}\n - long val : {6}\n - ulong val : {7}'\
.format(stDst.cVal, stDst. byVal, stDst.sVal, stDst.usVal, stDst.nVal, stDst.uVal, stDst.lVal, stDst.ulVal))