Python學習之路 —— struct模組使用

2020-08-11 18:07:30

用途

  1. 按照指定格式將 Python 數據型別轉換爲位元組流;
  2. 按照指定格式將位元組流轉換爲 Python 數據型別;
  3. 解析 C 語言中的結構體;

內建函數

函數 返回值 功能
pack(fmt, *args) string 按照指定格式(fmt),將數據(*args)轉換成位元組流,返回位元組流
pack_into(fmt, buffer, offset, *args) None 按照給定的格式(fmt),將數據(*args)轉換成位元組流,並將位元組流寫入以 offset (起始位)開始的 buffer
unpack(fmt, string) tuple 按照給定的格式(fmt)解析位元組流(string),並返回解析結果
unpack_from(fmt, buffer, offset=0) tuple 按照給定的格式(fmt)解析以 offset (起始位置) 開始的緩衝區(buffer),並返回解析結果
calcsize(fmt) int 計算給定的格式(fmt)佔用記憶體大小

格式化字串

位元組對齊

由於 C語言 在不同硬體裝置上採用的對齊方式不同,因此我們在解析數據流時要考慮位元組對齊的問題:

Character Byte order Size Alignment
@(預設) 本機 本機 本機,湊夠4位元組
= 本機 標準 none,按原位元組數
< 小端 標準 none,按原位元組數
> 大端 標準 none,按原位元組數
! network(大端) 標準 none,按原位元組數

型別轉換

格式符 C語言型別 Python型別 Standard size
x pad byte(填充位元組) no value
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I(大寫的i) unsigned int integer 4
l(小寫的L) long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string
p char[] string
P void * long

例程

從位元組流解析數據

struct data
{
    char name[20];
    float capacity;
    float Electricity;
    int status;
};
import struct

data = struct.unpack('<20sidx', data)  # data爲 C程式傳遞來的位元組流

數據封裝爲位元組流