gmark

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

分类:

技术点:

相关文章:

  • 2021-06-07
  • 2021-09-30
  • 2021-12-21
  • 2021-05-23
  • 2021-11-28
  • 2021-06-14
猜你喜欢
  • 2021-07-26
  • 2021-09-30
  • 2021-11-23
  • 2021-09-30
  • 2021-09-30
  • 2021-09-30
  • 2022-12-23
相关资源
相似解决方案