struct 模块简介
2024-08-31 08:31:15
用处
- 按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送;
- 按照指定格式将字节流转换为Python指定的数据类型;
- 处理二进制数据,如果用struct来处理文件的话,需要用’wb’,’rb’以二进制(字节流)写,读的方式来处理文件;
- 处理c语言中的结构体;
struct模块中的函数
函数 | return | explain |
---|---|---|
pack(fmt,v1,v2…) | string | 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. |
pack_into(fmt,buffer,offset,v1,v2…) | None | 按照给定的格式(fmt),将数据转换成字符串(字节流),并将字节流写入以offset开始的buffer中.(buffer为可写的缓冲区,可用array模块) |
unpack(fmt,v1,v2…..) | tuple | 按照给定的格式(fmt)解析字节流,并返回解析结果 |
pack_from(fmt,buffer,offset) | tuple | 按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果 |
calcsize(fmt) | size of fmt | 计算给定的格式(fmt)占用多少字节的内存,注意对齐方式 |
格式化字符串
当打包或者解包的时,需要按照特定的方式来打包或者解包.该方式就是格式化字符串,它指定了数据类型,除此之外,还有用于控制字节顺序、大小和对齐方式的特殊字符.
对齐方式
为了同c中的结构体交换数据,还要考虑c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下
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 |
注- -!
- _Bool在C99中定义,如果没有这个类型,则将这个类型视为char,一个字节;
- q和Q只适用于64位机器;
- 每个格式前可以有一个数字,表示这个类型的个数,如s格式表示一定长度的字符串,4s表示长度为4的字符串;4i表示四个int;
- P用来转换一个指针,其长度和计算机相关;
- f和d的长度和计算机相关;
最新文章
- nodejs中流(stream)的理解
- Android之UI编程(一):线性布局
- 【LeetCode OJ】Minimum Depth of Binary Tree
- DOM LOAD测试笔记
- jquery的一些用法
- 将word转化为swf 进行如同百度文库的般阅读
- 通过正则表达式获取url中参数
- struts2标签自动错行、换行问题
- Windows 2008 R2安装.NET Framework 4提示灾难性故障解决方法
- Eclipse安装反编译工具JadClipse for Eclipse手把手教程
- (转)JAVA新特征
- 浅谈Verilog HDL代码编写风格
- CF_229E_Gift_概率DP+组合数学
- c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy
- 手机端-ajax跨域请求滚屏分页
- java jdk 打开出错 Failed to load the JNI shared library
- java.io.IOException: Could not find status of job:job_1534233312603_0002
- js 面试题总结
- PyQt:eg4
- UCOS2系统内核讲述(二)_初始化调用函数
热门文章
- [SCSS] Convert SCSS Variable Arguments to JavaScript
- codeforces Round #258(div2) C解题报告
- 【转】selenium自动化测试环境搭建
- SRM 622 D2L3: Subsets, math, backtrack
- androidstudio集成ijkplayer教程
- 【NOIP 2009】 Hankson的趣味题
- hiho一下第76周《Suzhou Adventure》
- python 网络通讯 服务器端代码demo,能够同时处理多个客户端的连接请求
- C# 委托、事件
- 超级简单的利用javascript实现文件拖拽事件