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