본문 바로가기

개발자 레니는 지금 -/소프트웨어와 함께

[ Module ] Struct, c 구조체 호환


Python

Struct

#Ubuntu 18.04 LTS

#Python 3.6.5


#>> 상세 설명,  실행화면



When use?

C Struct와 Python value 간의 변환이나 파일에 Binary Data를 저장하거나, Network Connection 시에 주로 사용된다고 한다.

나는 C Struct와 Python value 간의 호환을 위해서 사용하였다.


사용하기 전에 조사를 해 본바로는 언어에 따라 내용을 직렬화해 data로 전달해 주어야 한다는 얘기도 있었다.

이 부분에 대해서는 추가로 테스트가 필요하지만,


C언어는 기본적으로 data를 직렬화하기 때문에 구조체의 내용을 그대로 전달하면 문제가 없을 것으로 생각된다.

( 일단, local에서 server와 client 코드의 동작을 잘 이루어 졌다. )


What is Struct?

struct는 무엇일까? C에서는 구조체라고 말하며 아마 Python에서는 특별히 따로 불리는 명칭 없이 똑같이 구조체라고 하는 것 같다.


01. At C

c/c++에서 구조화 된 데이터를 처리할 때 사용, struct라하고 구조체라고 부른다.


typedef struct

{

. . .

struct_name;


라는 형태를 이용해 선언한다.

구조체화되었다는 말은 의미가 연결되어 한 덩어리로 처리하는 방식을 얘기한다고 한다.

선언부 만으로는 변수의 저장공간을 확보하지 않기 때문에 개인이 헤더파일을 만들어서 include 선언시 중복선언을 해도 상관없다고 한다.


위의 선언시 typedef 키워드를 붙이지 않으면 struct를 초기화 할 때마다 struct struct_name value_name 형식으로 써주어야 하지만,

typedef 키워드를 선언 후 사용하면 초기화 할 때 struct_name value_name 으로 초기화 가능하다.

좀 더 자세한 내용이 알고 싶다면 아래 참조내용에 위키백과 부분을 클릭하자.\


02. At Python

파이썬에서 struct는 모듈로 정의되어있다. ( 모듈 = 라이브러리라고 생각하면 되겠다. )


import struct

기본으로 import되어 있는 것이 아니기 때문에 파이썬 코드 상단에 첨부하여주어야한다.


주요 함수로는 pack 과 unpack 이 있다.


- struct.pack(fmt, v1, v2, ...): return string

지정된 format에 따라 values(v1, v2)를 감싸고, return type은 string 이다.


- struct.unpack(fmt, string): return tuple

지정된 format에 따라 string을 풀어내며, return type은 tuple 이다.


- 지원하는 format 형식

 


Examples

그렇다면 struct를 이용해서, C와 Python 사이의 데이터를 주고 받고 싶을 때는 어떻게 구성해야할까?


01. 구성내용

서버: Python 3.6.5

클라이언트: C


실행환경: Ubuntu 18.04 LTS, local


전달 데이터

1. string data

2. struct data


02. 주의할 점

at C

- default encoding language는 ascii이다.

- 배열생성 후 memset 함수로 배열의 빈 공간을 널문자( '\0' )로 초기화 해주어야 한다.


at Python

- default encoding lanaguage는 utf-8이다.


Common

- 언어나 운영체제에 따라서 비트 배열순서가 다를 수 있기 때문에

2018/09/11 - [#Leni #레니 #♥] - 메모리 정렬 방식

네트워크를 이용해 전송할 때는 네트워크 형식으로 변환하여 송/수신 하는 것이 안전하다.

비트 배열순서가 같은 Ubuntu 18.04LTS에서의 C와 Python에서는 따로 변환을 하지 않아도 괜찮았다.

- C의 경우 htonl, ltoh 와 같은 함수가 존재하며, Python은 찾아보길 바란다.


03. 예제 코드는 Git-Hub page를 참조하여 사용하길 바란다.

 ᕕ( ᐛ )ᕗ  ٩( ᐛ )و Go to Git-Hub!! < Python-byLeni/Basic/usingStruct_withC > ᕕ( ᐛ )ᕗ  ٩( ᐛ )و 





#2018년09월10일

  1. 패딩이 붙는 것에 민감한 사람들이 있다, 그들은 이 페이지를 참조하자! [본문으로]