python中的struct主要是用來處理C結構數據的,讀入時先轉換為Python的字符串類型,然后再轉換為Python的結構化類型,比如元組(tuple)啥的~。一般輸入的渠道來源於文件或者網絡的二進制流。

1.struct.pack()和struct.unpack()

在轉化過程中,主要用到了一個格式化字符串(format strings),用來規定轉化的方法和格式。

下面來談談主要的方法:

1.1 struct.pack(fmt,v1,v2,.....)

將v1,v2等參數的值進行一層包裝,包裝的方法由fmt指定。被包裝的參數必須嚴格符合fmt。最后返回一個包裝后的字符串。

1.2 struct.unpack(fmt,string)

顧 名思義,解包。比如pack打包,然后就可以用unpack解包了。返回一個由解包數據(string)得到的一個元組(tuple), 即使僅有一個數據也會被解包成元組。其中len(string) 必須等於 calcsize(fmt),這里面涉及到了一個calcsize函數。struct.calcsize(fmt):這個就是用來計算fmt格式所描述的結構的大小。

格式字符串(format string)由一個或多個格式字符(format characters)組成,對於這些格式字符的描述參照Python manual如下

Format

c Type

Python

Note

x

pad byte

no value

c

char

string of length 1

b

signedchar

integer

B

unsignedchar

integer

?

_Bool

bool

(1)

h

short

integer

H

unsignedshort

integer

i

int

integer

I

unsignedint

integer or long

l

long

integer

L

unsignedlong

long

q

longlong

long

(2)

Q

unsignedlonglong

long

(2)

f

float

float

d

double

float

s

char[]

string

p

char[]

string

P

void*

long

2.代碼示例

1 importstruct2

3 #native byteorder

4 buffer = struct.pack("ihb", 1, 2, 3)5 printrepr(buffer)6 print struct.unpack("ihb", buffer)7

8 #data from a sequence, network byteorder

9 data = [1, 2, 3]10 buffer = struct.pack("!ihb", *data)11 printrepr(buffer)12 print struct.unpack("!ihb", buffer)13

14

15

16

17

18 Output:19

20 '\x01\x00\x00\x00\x02\x00\x03'

21 (1, 2, 3)22 '\x00\x00\x00\x01\x00\x02\x03'

23 (1, 2, 3)View Code

首 先將參數1,2,3打包,打包前1,2,3明顯屬於python數據類型中的integer,pack后就變成了C結構的二進制串,轉成 python的string類型來顯示就是  '\x01\x00\x00\x00\x02\x00\x03'。由於本機是小端('little- endian',關於大端和小端的區別請參照這里, 故而高位放在低地址段。i 代表C struct中的int類型,故而本機占4位,1則表示為01000000;h 代表C struct中的short類型,占2位,故表示為0200;同理b 代表C struct中的signed char類型,占1位,故而表示為03。

其他結構的轉換也類似,有些特別的可以參考官方文檔的Manual。

在Format string 的首位,有一個可選字符來決定大端和小端,列表如下:

@

native

native

=

native

standard

<

little-endian

standard

>

big-endian

standard

!

network (= big-endian)

standard

如果沒有附加,默認為@,即使用本機的字符順序(大端or小端),對於C結構的大小和內存中的對齊方式也是與本機相一致的(native),比如有的機器integer為2位而有的機器則為四位;有的機器內存對其位四位對齊,有的則是n位對齊(n未知,我也不知道多少)。

還有一個標准的選項,被描述為:如果使用標准的,則任何類型都無內存對齊。

比如剛才的小程序的后半部分,使用的format string中首位為!,即為大端模式標准對齊方式,故而輸出的為'\x00\x00\x00\x01\x00\x02\x03',其中高位自己就被放在內存的高地址位了。

python中pack函数,python中struct.pack()函數和struct.unpack()函數相关推荐

  1. scala 函数中嵌套函数_Scala中的嵌套函数 用法和示例

    scala 函数中嵌套函数 Scala中的嵌套函数 (Nested functions in Scala) A nested function is defined as a function whi ...

  2. python中pop函数_Python中的Pop函数

    python中pop函数 什么是弹出功能? (What is the pop function?) The method pop() removes and returns the last elem ...

  3. python调用math函数log_Python中求对数方法总结

    Python中Math库和Python库都具备求对数的函数. import numpy as np import math 1. Numpy库 1.1 求以e.2.10为底的对数 函数 功能 np.l ...

  4. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  5. python教程:函数参数中默认值及重要警告

    最有用的形式是对一个或多个参数指定一个默认值.这样创建的函数,可以用比定义时允许的更少的参数调用,比如: def ask_ok(prompt, retries=4, reminder='Please ...

  6. python中itemgetter函数_Python中的sorted函数以及operator.itemgetter函数

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [1,2,3] >>> b=op ...

  7. python数字类型转换函数_python中的各种数据类型中的数据格式转换

    一,转换list中的数据格式 str --> float (一)使用自定义函数 def str2float(list) strlist=[] for i in list: strlist.app ...

  8. python实现采样函数_python中resample函数实现重采样和降采样代码

    函数原型 resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='s ...

  9. python中mat函数_Python中flatten( )函数及函数用法详解

    flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列 ...

最新文章

  1. 【Windows】创建任务计划
  2. Azkaban-two_server模式-安装3和启动运行
  3. PAT1009 说反话 (20 分)【cinstring类型数组 ctrl z结束 OJ可以用EOF】
  4. 【类】变量复用,函数复用
  5. python你是否也走进了这个误区了_Python是不是被严重高估了?
  6. 在pandas中遍历DataFrame行
  7. 美术学考计算机,艺术设计专业能跨专业考计算机研究生吗?
  8. 编程中的移位运算符简单解释
  9. Kafka刚开启就秒退
  10. Mac Nginx 配置 Tomcat 配置 jdk环境变量 Nginx部署服务遇到的坑(1)
  11. python处理mat数据和处理png的区别_Python---利用scipy.misc等库对jpg以及png等图像数据预处理(用于深度学习喂数据)...
  12. 大数据时代--windows下spark的安装与配置教程
  13. android触摸滑动监听,Android 滑动监听的实例详解
  14. asp.net控件开发学习(1)
  15. ios12安装描述文件失败问题
  16. html5 retina 1像素,7种方法解决移动端Retina屏幕1px边框问题
  17. py-01-LINUX
  18. Android接入支付宝实现支付功能
  19. 微信小程序服务器该如何选择
  20. win10关闭防火墙脚本.bat

热门文章

  1. 动态规划——小A点菜(洛谷 P1164)
  2. 計算機二級-java05
  3. SQL必知必会-联结
  4. mysql between 等于_MySQL中BETWEEN子句的用法详解
  5. 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(4)
  6. 案例解读:RMAN 备份控制文件报错 ORA-00230
  7. Python 中的反转字符串:reversed()、切片等
  8. 如何基于MindSpore实现万亿级参数模型算法?
  9. 技术实践丨React Native 项目 Web 端同构
  10. 【我的物联网成长记14】车路协同,不只是车和路