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