pack函数python python pack_into

python 中 .pack() 的问题代码如下:
from tkinter import *
root=Tk()
lbred=Label(root,text="红色沟槽状边缘",fg="red",font=('微软雅黑',15),width=20,height=2,relief=GROOVE)
lbred.pack()
lbgreen=Label(root,text="绿色凸起的",fg="green",font=('微软雅黑',15),width=20,height=2,relief=RAISED)
lbgreen.pack()
lbblue=Label(root,text="蓝色脊状边缘",fg="blue",font=('微软雅黑',15),width=20,height=2,relief=RIDGE)
lbblue.pack()
lbyellow=Label(root,text="黄色凹陷的",fg="yellow",font=('微软雅黑',15),width=20,height=2,relief=SUNKEN)
lbyellow.pack()
lbpink=Label(root,text="粉红色平的",fg="pink",font=('微软雅黑',15),width=20,height=2,relief=FLAT)
lbpink.pack()
root.mainloop()
python struct pack怎么弄成二进制有的时候需要用python处理二进制数据 , 比如,存取文件 , socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体.
struct模块中最重要的三个函数是pack(), unpack(), calcsize()
8
#按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回解析出来的tupleunpack(fmt, string)# 计算给定的格式(fmt)占用多少字节的内存calcsize(fmt)
上述fmt中,支持的格式为:
FORMAT
C TYPE
PYTHON TYPE
STANDARD SIZE
NOTES
xpad byteno value
ccharstring of length 11
bsigned charinteger1(3)
Bunsigned charinteger1(3)
?_Boolbool1(1)
hshortinteger2(3)
Hunsigned shortinteger2(3)
iintinteger4(3)
Iunsigned intinteger4(3)
llonginteger4(3)
Lunsigned longinteger4(3)
qlong longinteger8(2), (3)
Qunsigned long longinteger8(2), (3)
ffloatfloat4(4)
ddoublefloat8(4)
schar[]string
pchar[]string
Pvoid *integer(5), (3)
注1.q和Q只在机器支持64位操作时有意思
注2.每个格式前可以有一个数字,表示个数
注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串
注4.P用来转换一个指针,其长度和机器字长相关
注5.最后一个可以用来表示指针类型的,占4个字节
为了同c中的结构体交换数据 , 还要考虑有的c或c++编译器使用了字节对齐 , 通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:
CHARACTER
BYTE ORDER
SIZE
ALIGNMENT
@nativenativenative
=nativestandardnone
little-endianstandardnone
big-endianstandardnone
!network (= big-endian)standardnone
使用方法是放在fmt的第一个位置,就像’@5s6sif’
例子1:
结构体如下:
structHeader{unsigned shortid;char[4] tag;unsigned intversion;unsigned intcount;}
通过socket.recv接收到了一个上面的结构体数据,存在字符串s中,现在需要把它解析出来,可以使用unpack()函数:
importstructid, tag, version, count =struct.unpack("!H4s2I", s)
上面的格式字符串中 , !表示我们要使用网络字节顺序解析,因为我们的数据是从网络中接收到的,在网络上传送的时候它是网络字节顺序的.后面的H表示 一个unsigned short的id,4s表示4字节长的字符串,2I表示有两个unsigned int类型的数据.
就通过一个unpack , 现在id, tag, version, count里已经保存好我们的信息了.
同样,也可以很方便的把本地数据再pack成struct格式:
ss =struct.pack("!H4s2I", id, tag, version, count);
pack函数就把id, tag, version, count按照指定的格式转换成了结构体Header,ss现在是一个字符串(实际上是类似于c结构体的字节流),可以通过 socket.send(ss)把这个字符串发送出去 。

推荐阅读