안녕하세요.
요즘 LoRa에서 End Device에서 바이트형식으로 오는 데이터를 파싱하기 위해 bytearray로 골머리를 썩고 있는데, 연구실 형님이 Python Struct을 추천해서 알게 되었습니다.
Python이 굉장히 잘 만든 언어이지만, 바이트나 비트를 처리하기에는 너무 까다롭습니다.
bytearray를 이용해 데이터를 파싱하거나 checksum 계산을 수행할 때 PTSD가 왔는데, Python Struct는 정말 신세계에 가까웠습니다.
파이썬 Struct는 C언어 Struct와 비슷합니다. 자세한 내용은 공식문서를 통해 참고하시면 됩니다.
https://docs.python.org/3/library/struct.html
https://coding-yoon.tistory.com/120
위 내용을 이해할 수 있다면, 저 말이 무슨 말인지 쉽게 이해할 수 있습니다.
아래와 같은 하나의 14바이트의 packet을 전송했다고 가정합니다. ( 아래 코드는 실제 패킷 중 하나이다. 쉬운 이해를 위해 그림으로)
위 union을 설명하는 블로그에서는 __attribute__에 대해 이야기하지 않았습니다. __attribute__는 패딩 비트가 생기지 않도록 합니다. 그러므로 16바이트가 아닌 14바이트로 메모리가 할당됩니다.
파이썬에서 위 같은 바이트로 이루어진 패킷을 받을려면 어떻게 해야하나? bytearray를 쓰려고 하면 정신이 혼미해지지만, Python Struct를 사용하면 머리의 두통이 사라진다.
사용법은 간단하다. 한 줄이면 위 데이터를 쉽게 파싱할 수 있다.
from struct import *
"""
Do Something
"""
data = "14바이트패킷" # stirng 아님 # <class 'bytes'>
payload = unpack('<Hfff',data)
u_cnt = payload[0]
lat = payload[1]
long_ = payload[2]
alt = payload[3]
unpack 명령어 한 줄로 파싱이 가능하다.
'<Hfff' 의 foramt 형식만 사용할 줄 알면 된다. 간단하다. 위 python 공식 문서에 나와 있는 내용이다.
1. 맨 처음쓰는 것은 바이트 정렬이다. 위 사진의 패킷은 litte endian이므로 '<' 를 추가한다.
2. 바이트 정렬을 적었다면, 데이터의 타입이 나오게 된다. 패킷의 구성은 unsigned int(2), float(4), float(4), float(4)의 순서로 아래 표의 C Type을 보고 해당하는 format을 적으면된다. 'HFF'
결과적으로 unpack은 list 형태로 payload를 반환하게 된다.
'Python > Project' 카테고리의 다른 글
네이버 블로그 자동 공감 누르기 (0) | 2023.10.02 |
---|---|
네이버 블로그 서로 이웃 추가 프로그램 ver1.0, ver2.0 (0) | 2023.10.02 |
[파이썬 프로젝트] Python CSV 이어서 저장하기, header 붙이기 (0) | 2021.09.07 |
[프로젝트]Pandas Dataframe을 이용하여 데이터 전처리 과정 (1) | 2021.02.23 |