[转载] Python: struct 模块之字节对齐问题
参考链接: Python中的struct模块
P
y
t
h
o
n
Python
Python 在二进制写文件时,可以用
s
t
r
u
c
t
struct
struct 模块将数据捆绑成结构体转化成字节流,为了方便与
C
C
C 交互,避免
C
C
C 在读取二进制字节流时因为
C
C
C 的字节对齐问题而造成不必要的麻烦,
P
y
t
h
o
n
Python
Python 的
s
t
r
u
c
t
struct
struct 模块默认按照
C
C
C 的字节对齐方式进行对齐。
然而,并不像想象中那样简单。
P
y
t
h
o
n
Python
Python 的
s
t
r
u
c
t
struct
struct 模块的字节对齐坑了我整整一上午。
首先我用
P
y
t
h
o
n
Python
Python 写好了二进制文件,并且测试用
P
y
t
h
o
n
Python
Python 去读取该二进制文件,测试良好,没有什么问题,但是当我写
C
C
C 的接口时,却发现数据一直有问题。经过一上午的排查,总算发现,字节的读取地址出现了问题,然而
P
y
t
h
o
n
Python
Python 的却没有这个问题,所以一下子就断定是
s
t
r
u
c
t
struct
struct 模块的字节对齐出了幺蛾子。
这里我用
P
y
t
h
o
n
Python
Python 写进了一堆
H
e
a
d
e
r
Header
Header,
struct header
{
long long a;
int b;
};
转化成
s
t
r
u
c
t
struct
struct 模块的格式化字符串为
′
q
i
′
'qi'
′qi′,在
C
C
C 中,由于字节对齐的缘故,这个
H
e
a
d
e
r
Header
Header 应该占有
16
16
16 个字节,但是在
P
y
t
h
o
n
Python
Python 里却不是这样……
>>> import struct
>>> struct.calcsize('qi')
12
竟然等于
12
12
12 个字节,显然没有字节对齐……然后试了一下
′
i
q
′
'iq'
′iq′,又让我吃了一惊……
>>> struct.calcsize('iq')
16
你没有看错,这里竟然字节对齐了,变成了
16
16
16 字节。这波操作骚气啊……
用
C
C
C 反复测试了两种写法,结果均为
16
16
16 字节。
不知道该怎么喷
P
y
t
h
o
n
Python
Python,最后图个省事儿,弄成了
′
2
q
′
'2q'
′2q′,妈妈再也不用担心字节对齐的问题了。
不过,有那么一种可能是,不同的
C
C
C 编译器对这两种写法的字节对齐方式存在差异?不得而知,也没有具体去测试,毕竟我是一个不求甚解的人。
对了,如果有哪位大佬的编译器的确是不一样的字节对齐结果,麻烦告知用的是什么编译器,让我避开他……
[转载] Python: struct 模块之字节对齐问题相关推荐
- python struct模块的使用
struct模块中的函数 函数 return explain pack(fmt,v1,v2-) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. pack_in ...
- Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...
在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项 /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令 #pragma pack ...
- python struct 模块
Python没有提供直接的将用户定义的数据类型和文件IO关联起来的功能,但是它提供了struct库(是一个内置库)--我们可以以二进制模式来写这些数据(有趣的是,它真的是设计来讲文本数据写为缓存的) ...
- python struct模块_python struct 模块
struct模块用于二进制和结构体之间的互相转化,此模块中大部分函数接受一个实现了Buffer协议的对象,最常见的实现了Buffer协议的对象包括bytes.bytearray等,大多数像byte数组 ...
- typedef __packed struct (结构体字节对齐)(转)
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...
- [转载] Python—urllib模块
参考链接: Python Urllib模块 urllib模块提供的上层接口使用户能够像读取本地文件一样读取WWW或FTP上的数据,使用起来比C++.C#等编程语言更加方便. 常用的方法如下: 1.ur ...
- python模块的发布_(转载)Python中模块的发布与安装
模块(Module) Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个 ...
- python中weekday_[转载] Python日历模块| 使用示例的weekday()方法
参考链接: Python中的日历函数 2(monthrange(),prcal(),weekday()-) Python calendar.weekday()方法 (Python calendar.w ...
- [转载] Python format()格式:中文对齐问题
参考链接: Python format() :<填充><对齐><宽度>,<精度><类型>引导符号填充单个字符,表示所创槽区域空余部分的填充 ...
最新文章
- 出现Press ENTER or type command to continue的原因
- docker 拉取oracle_Docker 拉取 oracle 11g镜像配置-Go语言中文社区
- AE脚本Swiss Knife Mac 瑞士军刀MG动画制作插件
- Windows API 进程状态信息函数
- 记录一次数据同步到数据仓库的架构与实践
- 如何以用户身份登录MySQL_解析:如何以普通用户的身份运行 MySQL
- TypeScript基础入门 - 接口 - 简介
- 算法设计与分析学习总结
- 中美线径对照表_美国线规对照表
- MAC提示“因为它来自身份不明的开发者” 或“已损坏,打不开“怎么办?
- JSP和Thymeleaf
- MATLAB 2017b 安装教程 (推荐)
- pythonobject转int_python – Pandas:将dtype’object’转换为int
- 华为服务器忘记系统密码忘了,服务器忘记密码重置
- 小白以及计算机类学生的福音!java查看内存溢出的工具
- 《MINECRAFT我的世界 新手完全攻略(第3版)》一2.2 去找树
- wordpress 背景_如何为您的WordPress网站找到美丽的背景图像
- 绩效考核成绩管理平台
- 读《中国通史》(1)
- BP神经网络实现异或功能
热门文章
- 【NOIP2015】【Vijos1979】信息传递(有向图最小环大小)
- vscode 清空缓存_如何清除Visual Studio Code的TypeScript的intellisense缓存?
- nedtworking
- JQueryDOM之属性操作
- html5之input标签学习
- python和selenium的关系_selenium之python源码解读-webdriver继承关系
- java 连接oracle_「事件驱动架构」使用GoldenGate创建从Oracle到Kafka的CDC事件流
- JAVA集合一:ArrayList和LinkedList
- 试题18 四平方和(枚举法)
- 2018 Multi-University Training Contest 4: B. Harvest of Apples(分块打表)