[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

posted @ 2012-09-27 22:26  gmark  阅读(1288)  评论(0)    收藏  举报