参考链接: 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 模块之字节对齐问题相关推荐

  1. python struct模块的使用

    struct模块中的函数 函数 return explain pack(fmt,v1,v2-) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. pack_in ...

  2. Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...

    在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令   #pragma pack ...

  3. python struct 模块

    Python没有提供直接的将用户定义的数据类型和文件IO关联起来的功能,但是它提供了struct库(是一个内置库)--我们可以以二进制模式来写这些数据(有趣的是,它真的是设计来讲文本数据写为缓存的) ...

  4. python struct模块_python struct 模块

    struct模块用于二进制和结构体之间的互相转化,此模块中大部分函数接受一个实现了Buffer协议的对象,最常见的实现了Buffer协议的对象包括bytes.bytearray等,大多数像byte数组 ...

  5. typedef __packed struct (结构体字节对齐)(转)

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...

  6. [转载] Python—urllib模块

    参考链接: Python Urllib模块 urllib模块提供的上层接口使用户能够像读取本地文件一样读取WWW或FTP上的数据,使用起来比C++.C#等编程语言更加方便. 常用的方法如下: 1.ur ...

  7. python模块的发布_(转载)Python中模块的发布与安装

    模块(Module) Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个 ...

  8. python中weekday_[转载] Python日历模块| 使用示例的weekday()方法

    参考链接: Python中的日历函数 2(monthrange(),prcal(),weekday()-) Python calendar.weekday()方法 (Python calendar.w ...

  9. [转载] Python format()格式:中文对齐问题

    参考链接: Python format() :<填充><对齐><宽度>,<精度><类型>引导符号填充单个字符,表示所创槽区域空余部分的填充 ...

最新文章

  1. 出现Press ENTER or type command to continue的原因
  2. docker 拉取oracle_Docker 拉取 oracle 11g镜像配置-Go语言中文社区
  3. AE脚本Swiss Knife Mac 瑞士军刀MG动画制作插件
  4. Windows API 进程状态信息函数
  5. 记录一次数据同步到数据仓库的架构与实践
  6. 如何以用户身份登录MySQL_解析:如何以普通用户的身份运行 MySQL
  7. TypeScript基础入门 - 接口 - 简介
  8. 算法设计与分析学习总结
  9. 中美线径对照表_美国线规对照表
  10. MAC提示“因为它来自身份不明的开发者” 或“已损坏,打不开“怎么办?
  11. JSP和Thymeleaf
  12. MATLAB 2017b 安装教程 (推荐)
  13. pythonobject转int_python – Pandas:将dtype’object’转换为int
  14. 华为服务器忘记系统密码忘了,服务器忘记密码重置
  15. 小白以及计算机类学生的福音!java查看内存溢出的工具
  16. 《MINECRAFT我的世界 新手完全攻略(第3版)》一2.2 去找树
  17. wordpress 背景_如何为您的WordPress网站找到美丽的背景图像
  18. 绩效考核成绩管理平台
  19. 读《中国通史》(1)
  20. BP神经网络实现异或功能

热门文章

  1. 【NOIP2015】【Vijos1979】信息传递(有向图最小环大小)
  2. vscode 清空缓存_如何清除Visual Studio Code的TypeScript的intellisense缓存?
  3. nedtworking
  4. JQueryDOM之属性操作
  5. html5之input标签学习
  6. python和selenium的关系_selenium之python源码解读-webdriver继承关系
  7. java 连接oracle_「事件驱动架构」使用GoldenGate创建从Oracle到Kafka的CDC事件流
  8. JAVA集合一:ArrayList和LinkedList
  9. 试题18 四平方和(枚举法)
  10. 2018 Multi-University Training Contest 4: B. Harvest of Apples(分块打表)