python struct.pack中的对齐字节问题

最近测试涉及到了序列字节化相关问题,碰到一个头疼的问题

buff = struct.pack("3s","B00")
    print repr(buff)

输出:‘B00‘

buff = struct.pack(‘i‘,10172)
 print repr(buff)

输出:"\xbc‘\x00\x00"

buff = struct.pack("3si","B00",10172)
print repr(buff)

输出:"B00\x00\xbc‘\x00\x00"

即:struct.pack("3s","B00")+struct.pack(‘i‘,10172) != struct.pack("3si","B00",10172)

但struct.pack("!3s","B00")+struct.pack(‘!i‘,10172) == struct.pack("!3si","B00",10172)是相等的

问题分析:

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

Character Byte order Size and alignment
@ native native            凑够4个字节
= native standard        按原字节数
< little-endian standard        按原字节数
> big-endian standard       按原字节数
! network (= big-endian)
standard       按原字节数

使用方法是放在fmt的第一个位置,就像‘@5s6sif‘

参见如下

http://www.coder4.com/archives/3838

http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html

http://zhidao.baidu.com/link?url=Wd7SipMBMz7-lCTtnV3kUmjF4OMlRqZZUtfY0Zb3SqF5HKsCbwUBJFw8s2FfpTTv55Y-o-YHctDEfJoQ_ILTYAM8-sOWvOPS4aJtlHffNZ_

时间: 2024-12-21 18:43:07

python struct.pack中的对齐字节问题的相关文章

python struct.pack方法报错argument for &#39;s&#39; must be a bytes object 解决

参考 https://blog.csdn.net/weixin_38383877/article/details/81100192 在python3下使用struct模块代码 fileHead = struct.pack('128sl', os.path.basename(filePath),os.stat(filePath).st_size); 抛出异常: argument for 's' must be a bytes object必须要是字节类型. 解决办法: 把字符串的地方转为字节类型,

python struct.pack() 二进制文件,文件中打包二进制数据的存储与解析

学习Python的过程中,遇到一个问题,在<Python学习手册>(也就是<learning python>)中,元组.文件及其他章节里,关于处理二进制文件里,有这么一段代码的处理: >>>F=open('data.bin','wb') >>>import struct >>>data=struct.pack('i4sh',7,'spam',8) >>>data b'\x00\x00\x00\x07spam\x

C++ 学习笔记3,struct长度测试,struct存储时的对齐方式

之所以专门为struct的长度写一篇测试,是因为原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看下面的测试: 一.在Windows7 32bit ,IDE为VS2010中测试 #include <iostream> using namespace std; //结构体测试 //测试环境为Windows 32bit,IDE为VS2010 //结构体 struct structZero//长度为1,无疑问 { char c; }; //从下面开始

VC++中内存对齐

我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体. 为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则.但是,不同的编译器可能有不同的实现,本文只针对VC++编译器,这里使用的IDE是VS2012. #pragma pack()是一个预处理,表示内存对齐.布局控制#pragma,为编译程序提供非常规的控制流信息. /**********结构体的大小的规则*************/ 结构体大小是处理器位数和结构体内最长数据元素所占字节数二

struct结构体大小-对齐

结构类型定义和结构变量说明 在实际问题中,一组数据往往具有不同的数据类型.例如, 在学生登记表中,姓名应为字符型:学号可为整型或字符型: 年龄应为整型:性别应为字符型:成绩可为整型或实型. 显然不能用一个数组来存放这一组数据. 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理.为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”. 它相当于其它高级语言中的记录. 一.结构的定义 struct 结构名 { 成员表列 }; 成员名的命名应符合标识符的书写规定. 例如: struc

c语言中内存对齐问题

在最近的项目中,我们涉及到了“内存对齐”技术.对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”.“内存对齐”应该是编译器的“管辖范围”.编译器为程序中的每个“数据单元”安排在适当的位置上.但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”.如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了. 一.内存对齐的原因 大部分的参考资料都是如是说的: 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能在某些地址处取某些特定类

Python struct与小端存储

参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017685387246080 在使用Python 实现字符向字节数据类型转换的时候,Python没有提供专门处理字节的数据类型,不过Python提供了一个Struct模块提供bytes和其他二进制数据类型的转换 pack(),将任意数据类型转变为bytes数据类型 >>> import struct >>> struct.pack('>I', 1024

C语言中内存对齐

今天一考研同学问我一个问题,一个结构体有一个int类型成员和一个char类型成员,问我这个结构体类型占多少个字节,我直接编个程序给他看结果.这个结构体占八个字节,咦,当时我蛮纳闷的,一个int类型四个字节,一个char类型一个字节,怎么这个结构体的大小不是五个字节呢??上网查了一下,结果发现还有个内存对齐的问题. 为了方便操作系统访问内存,一次访问四个字节,为了避免一个变量的二次访问,通常设置采用内存对齐. 1 #include<stdio.h> 2 3 typedef struct 4 {

【转】C/C++ struct/class/union内存对齐

原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括stru