协议打包

# -*- coding:utf-8 -*-

import struct

def pack(command_id, sequence, session_id, body):
    """
    网络传输
    @param command_id: 协议编号
    @param sequence: 序列号
    @param session_id: 
    @param body: 包体,str类型
    
    @return: 二进制串
    """
    
    header_size, header_data = pack_header(command_id, sequence, session_id)
    body_size, body_data = pack_body(body)
    size = header_size + body_size
    data = struct.pack('!I', size) + header_data + body_data
    return data

def pack_header(command_id, sequence, session_id):
    """
    包头
    """
    if isinstance(session_id, unicode):
        session_id.encode('utf-8')
    fmt = '!IIB%ds' % len(session_id)
    header_size = struct.calcsize(fmt)
    data = struct.pack(fmt, command_id, sequence, len(session_id), session_id)
    return header_size, data

def pack_body(body):
    """
    包体
    """
    fmt = '!H%ds' % len(body)
    body_size = struct.calcsize(fmt)
    data = struct.pack(fmt, len(body), body)
    return body_size, data
    
def unpack(data): 
    """
    解包
    """
    command_id, sequence, session_id, data = unpack_header(data)
    body = unpack_body(data)
    return command_id, sequence, session_id, body

def unpack_size(data):
    """
    总长度
    """
    (size,) = struct.unpack('!i', data)
    return size

def unpack_header(data):
    """
    包头
    """
    (command_id,), data = struct.unpack('!I', data[:4]), data[4:]
    (sequence,), data = struct.unpack('!I', data[:4]), data[4:]
    (session_size,), data = struct.unpack('!B', data[:1]), data[1:]
    (session_id,), data = struct.unpack('!%ds' % (session_size), data[:session_size]), data[session_size:]
    return command_id, sequence, session_id, data

def unpack_body(data):
    """
    包体
    """
    (body_size,), data = struct.unpack('!H', data[:2]), data[2:]
    (body,) = struct.unpack('!%ds' % (body_size,), data)
    if isinstance(body, unicode):
        body.encode('utf-8')
    return body

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值