본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 라이브러리 2장 - 바이너리 데이터 다루기(맥OS 기준)

OS: MAC

참고: 👉 점프 투 파이썬 - 라이브러리 예제 바로가기

004. C로 만든 데이터를 출력하려면? ― struct

- struct는 C처럼 데이터를 이진형으로 변환(pack) 하거나 다시 풀어(unpack) 주는 도구.(바이트 ↔ 숫자 변환)
- 파일·네트워크·하드웨어 데이터 교환 시 필수.

구분 내용 예시 결과
모듈 C 구조체 데이터 처리용
(pack, unpack)
import struct  
pack(fmt, v...)
=pack(형태,값)
값을 지정한 형태(타입)로 바꿔
= 값을 포장(pack)
import struct
struct.pack('i', 10)
#10을 4바이트 정수형태로 바꿔라
b'\n\x00\x00\x00'
unpack(fmt, bytes) 바이트를 지정한 형식(fmt)으로 해석해서, 원래의 값으로 바꿔라
= 바이트를 풀기(unpack)
import struct
struct.unpack('i', b'\n\x00\x00\x00')
(10,)
#튜플 형태로 반환.
값이 하나라도 항상 튜플로 줌
calcsize(fmt) 포맷 크기 계산 import struct
struct.calcsize('i')
4
소문자 포맷(음수 가능) b : signed char (1바이트 정수)
h : short (2바이트 정수)
i : int (4바이트 정수)
f : float((IEEE 754 단정도)
d : double(배정도 실수)
s : 문자열(bytes)
① import struct
struct.pack('hif', 5, 10, 2.3)

② import struct
struct.pack('5s', b'hello')
 b'\x05\x00\x00\x00\n\x00\x00\x0033\x13@'

b'hello'
대문자 포맷(음수 불가) B, H, I, F, D, S ① import struct
struct.pack('B', 250)

② import struct
struct.pack('B', -250)

  b'\xfa'

struct.error
< : 리틀엔디안 낮은 바이트부터 저장
주로 대부분의 PC (Intel, AMD, ARM) 사용
import struct
struct.unpack('<i', b'\x01\x00\x00\x00')
(1,)
> : 빅엔디안 높은 바이트부터 저장
주로 일부 네트워크 장비, 옛 IBM, Motorola CPU 등 사용
import struct
struct.unpack('>i', b'\x01\x00\x00\x00')
(16777216,)
C로 저장된 로그 분석/
파일을 파이썬에서 읽을 때
open(filename, 'rb')
→ struct.unpack() 사용
1) 예시 참고   
바이너리 통신,
IoT 센서 데이터 복원 시
struct.pack()으로
응답 데이터 생성
   

 

C로 저장된 로그 분석 풀이

 

라이브러리 예제 문제: 다음은 구조체 데이터를 output 파일에 저장하는 C 프로그램으로, save_type은 double형 1개, int형 1개, char형 1개로 이루어진 구조체다. 이렇게 만들어진 바이너리 구조체 데이터(output 파일)를 파이썬으로 읽어서 내용을 확인하려면 어떻게 해야 할까? 

[파일명: struct_sample.c]        #C 소스 파일 이름. 진짜 파일이름이 아님.(함정임)
#include <stdio.h>
typedef struct { 
    double v;        #double(8바이트)
    int t;              #int(4바이트)
    char c;         #char(1바이트)
} save_type;

int main() {
    save_type s = {7.5f, 15, 'A'};         #double, int, char 순서대로 작성됨. 다만 C코드라서 파이썬 즉 바이트 타입으로 변환해서 사용필수!
    FILE *f = fopen("output", "w");
    fwrite(&s, sizeof(save_type), 1, f);
    fclose(f);
    return 0;
}

라이브러리 예제 2장 문제 풀이 및 정답 7.5 15 A

 

스마트 인용 부호 및 대시 사용 끄기를 했는데도 메모장에 작성해서 파이썬 셸에 붙어넣으니 또 부호 오류가 발생했다.

코드 예시는 코딩용 편집기에서 하는게 좋다고 한다.

Visual Studio Code

1. 기본 세팅

👉 VSCode 다운로드 VSCode 실행 좌측 아래 톱니바퀴(⚙️) 클릭 → 설정(Settings)  검색창에 python 입력

→ “Python: Default Interpreter Path” 항목이 보이면 OK(나중에 파이썬 경로 지정 가능)

 

 

2. 파이썬 확장 기능 설치 (필수) 

왼쪽 메뉴에서 확장(Extensions) 아이콘 (블록 네모 4개 모양) 클릭 → 검색창에 Python 입력

Microsoft Python Extension 설치

 

 

3. 스마트 따옴표 자동완성 끄기

Cmd + , → 검색창에 autoClosingQuotes 입력 → 설정값을 "never" 로 변경

 

4. 파이썬 자동 줄바꿈 / 들여쓰기 설정 

검색창에 format on save 입력 → Editor: Format On Save 체크 

검색창에 tab size 입력 → Editor: Tab Size = 4 (파이썬 표준 들여쓰기)

 

5. 추가 추천 세팅 (settings.json 직접 열기)

Cmd + Shift + P 입력 → 작은 입력창에 > 기호가 자동으로 찍혀 있어야함(명령어 팔레트)  그 상태에서 Open Settings (JSON)
 입력  Preferences: Open Settings (JSON) 선택 → 하단의 코드 입력(중복코드는 보고 지우면 됨)

 

{
    "editor.autoClosingQuotes": "never",
    "editor.formatOnSave": true,
    "editor.autoClosingBrackets": "always",
    "editor.tabSize": 4,
    "files.encoding": "utf8",
    "python.analysis.autoImportCompletions": true,
    "python.defaultInterpreterPath": "python3",
    "terminal.integrated.defaultProfile.osx": "bash"
}

 

코드 입력 후

6. 파이썬 코드 바로 실행하기

VSCode 상단 파일(File) → 새 파일(New File) 클릭  파일명 test.py로 저장  print("자동 따옴표 테스트")  ▶️선택(또는 Cmd + F5)  결과 확인

 

아 근데 내가 원한건 따옴표가 자동으로 안붙는게 아닌데..

따옴표가 변형되지 않는건데 무튼 몰라 이제부터 예시는 여기서 작성해야겠다.
메모장이랑 터미널 따로 안 켜도 되니까 편하겠군.