Python与C、C++交互的时候,如果进行网络消息的收发,需要讲数据打包解包为字节流。
这时候就会用到Struct模块中的pack、unpack函数
打包:
PKG = ''# '!' means network byte#PkgHeadPKG += pack('!i', 0x54434d) #intPKG += pack('!H', 4) #ushortPKG += pack('!i', calcsize('!iiHiiiiIic')) #length int 35PKG += pack('!i', 1) #intPKG += pack('!i', 0) #intPKG += pack('!i', 0) #intPKG += pack('!I', 0) #uintPKG += pack('!i', 0) #int#PkgBodyPKG += pack('!i', 1) #intPKG += pack('!c', '0') #char
pack函数第一个参数是要打包的数据类型,第二个参数是要打包的值,其中 calcsize 方法是自动计算类型字节长度
解包一样
def upk(PKG):iRet = Trueif unpack('!i', PKG[0:4])[0] != 0x54434d:iRet = Falseif unpack('!H', PKG[4:6])[0] != 4:iRet = Falseif unpack('!i', PKG[6:10])[0] !=35:iRet = Falseif unpack('!i', PKG[10:14])[0] != 2:iRet = Falseif unpack('!i', PKG[14:18])[0] != 0:iRet = Falseif unpack('!i', PKG[18:22])[0] != 0:iRet = Falseif unpack('!i', PKG[22:26])[0] != 0:iRet = Falseif unpack('!i', PKG[26:30])[0] != 0:iRet = Falseif unpack('!i', PKG[30:34])[0] != 2:iRet = Falsereturn iRet
解包后的结果是一个tuple,即使只有一个元素。
详情可参考: http://docs.python.org/library/struct.html?highlight=pack#struct.pack