在学习socket编程前,需要先了解下struct模块。使用struct模块可以在不改变传输数据类型的前提下,实现python跨平台使用;
Struct 模块
作用:
Python是一门非常简洁的语言,对于数据类型的表示,不像其他语言预定义了许多类型(如:在C#中,光整型就定义了8种),它只定义了六种基本类型:字符串,整数,浮点数,元组,列表,字典。通过这六种数据类型,我们可以完成大部分工作。但当Python需要通过网络与其他的平台进行交互的时候,必须考虑到将这些数据类型与其他平台或语言之间的类型进行互相转换问题。打个比方:C++写的客户端发送一个int型(4字节)变量的数据到Python写的服务器,Python接收到表示这个整数的4个字节数据,怎么解析成Python认识的整数呢? Python的标准模块struct就用来解决这个问题。
将打包的数据类型,发给服务器端;服务器端解包时,直接还原回来,这样传输之后数据类型不会被改变;
struct.pack
其函数原型为:struct.pack(fmt, v1, v2, ...),参数fmt是格式字符串,v1, v2, ...表示要转换的python值。
# -*- coding: UTF-8 -*-
import struct
a = 20
b = 400
s = struct.pack("ii", a, b) #转换后的s是bytes类型
print ('length:', len(s))
print (s)
print (type(s))
s1 = struct.pack("2i", a, b)
print ('length:', len(s1))
print (s1)
print (type(s1))
** “ii”和”2i”表示的都是将两个参数转化为int类型,网络间传输的是bytes类型
格式符"i"表示转换为int,'ii'表示有两个int变量。进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节),可以看到输出的结果是乱码,因为结果是二进制数据。