为什么 struct.calcsize("5id")
是32呢?
struct RateInfo
{
time_t time;
int open;
int high,low,close;
double vol;
};
需要unpack
这样的一个 struct,应该怎么样定义fmt呢?
参考了:
https://www.coder4.com/archiv...
https://docs.python.org/3.6/l...
谢谢!
老铁, 以下内容仅供参考:
一.为什么 struct.calcsize("5id") 是32
拿C语言的结构体来说明一下:
fmt
"5id"相当于下面这样的一个结构体:先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。
因此
第一个成员
i1
的偏移量为0。第二个成员
i2
的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4), 其值为4第三个成员
i3
的偏移量是第二个成员的偏移量加上第二个成员的大小(4+4), 其值为8第四个成员
i4
的偏移量是第三个成员的偏移量加上第三个成员的大小(8+4), 其值为12第五个成员
i5
的偏移量是第四个成员的偏移量加上第四个成员的大小(12+4), 其值为16第六个成员
j
的偏移量是第五个成员的偏移量加上第五个成员的大小(16+4),其值为20.实际上,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:
对照第一条,上面的例子中前五个成员的偏移量都满足要求,但第六个成员
j
的偏移量为20,并不是自身(double)
大小的整数倍。编译器在处理时会在第二个成员后面补上4个空字节,使得第三个成员的偏移量变成24。对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为32,满足要求。
所以,
struct.calcsize("5id") 是32
参考自这位大佬的文章:计算结构体的大小:https://blog.csdn.net/csw_100...
二.如何定义fmt
我查了一下
time_t
, 应该是是长整型
参考自:C语言中time_t数据类型详细介绍
先告诉你答案吧:
那如何选择
the first character of the format string
图片来源: https://docs.python.org/3.6/l...
我就说说我的理解吧:
@
是最常用的, 如果你需要填充对其, 那一定选它=
格式字符的排序可能会对大小产生影响, 但如果你不想让顺序产生影响, 用它无疑, 但是他不会帮你填充对齐!
多用于网络字节, 我也不大懂(希望大佬帮忙解释下, 欢迎直接编辑), 也不会帮你填充对齐>
本机字节顺序是big-endian
, 也不大懂, 也不会帮你填充对齐<
本机字节顺序是little-endian
, 也不大懂, 也不会帮你填充对齐参考自:
struct官方文档:https://docs.python.org/3/lib...