最近在研究socket数据传输,数据包是自定义的,需要用到struct.pack对字节数据进行打包。其中一个数据包的数据结构是这样的
cType(1字节) | msgId(1字节) | appId(36字节字符串) | imei(15字节字符串) |
import struct
cType = 0x00
msgId = 0x60
appId = '996da38d-a7be-4947-aa4c-f8208b5f4ade'
imei = '869858030720693'
data = struct.pack('bb36s15s', cType, msgId, appId, imei)
print(data)
print(len(data))
报了个错
查了一下,这个错是因为字符串没有转换成UTF-8编码。
修改代码
import struct
cType = 0x00
msgId = 0x60
appId = '996da38d-a7be-4947-aa4c-f8208b5f4ade'
imei = '869858030720693'
data = struct.pack('bb36s15s', cType, msgId, appId.encode('utf-8'), imei.encode('utf-8'))
print(data)
print(len(data))
问题解决,但是每个字符串都要调用encode(’utf-8‘)比较繁琐。把struct.pack包装一下,修改代码如下
# -*- coding: utf-8 -*-
import struct
def pack(fmt, *args):
args_list = list(args)
for i, arg in enumerate(args_list):
if isinstance(arg, str):
args_list[i] = arg.encode('utf-8')
return struct.pack(fmt, *args_list)
cType = 0x00
msgId = 0x60
appId = '996da38d-a7be-4947-aa4c-f8208b5f4ade'
imei = '869858030720693'
data = pack('bb36s15s', cType, msgId, appId, imei)
print(data)
print(len(data))
以后直接调用这个pack函数就行了,不需要再考虑编码转换问题了。还有什么更好的办法吗?欢迎各位小伙伴留言交流!