`
ghh0000
  • 浏览: 23730 次
  • 来自: ...
社区版块
存档分类
最新评论

协议打包

 
阅读更多
# -*- 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

 

分享到:
评论

相关推荐

    C++ 实现的HTTP协议打包解析器

    这个库不依赖别的库,不需要捆绑庞大的网络框架,它就实现一个朴素的需求:对http报文进行解析和打包。 公司是一家上市网络公司,这个小库使用了2年了,还是比较好用。 有问题或者改进意见可以联系我。

    rtmp 协议打包发送

    在这个场景中,我们讨论的是如何使用C++来实现RTMP协议打包发送,并且特别关注H264编码的视频数据。 1. **RTMP协议基础**: - RTMP是基于TCP的,它通过建立连接、握手、建立通道、发送命令和数据等步骤来工作。 -...

    微软RDP协议打包下载

    综上所述,"微软RDP协议打包下载"提供了深入了解和开发基于RDP技术的应用程序的基础。对于系统管理员、程序员或IT专业人士来说,掌握RDP协议的知识能够提升远程访问的效率和安全性。通过深入学习和理解这份文档,你...

    1588同步协议打包

    **1588同步协议打包** 1588同步协议,全称为Precision Time Protocol(精确时间协议),在工业控制、电信网络、电力系统等领域中扮演着至关重要的角色。该协议由IEEE(电气与电子工程师协会)制定,主要目标是实现...

    3GPP 38.521、36.521、51.010、34.121四个协议打包

    3GPP TS 34.121-1 version 15.2.0 Release 15 3GPP TS 36.521-1 version 15.2.0 Release 15 3GPP TS 38.521-1 version 15.0.0 Release 15 3GPP TS 51.010-1 version 13.7.0 ...四个文件打包一起,研究5G的可以看下

    csr蓝牙基本协议打包, 一包在手入门不愁

    CSR(Cambridge Silicon Radio)是一家知名的蓝牙芯片制造商,后来被Qualcomm收购。 CSR的蓝牙协议栈是实现...熟悉CSR的蓝牙协议打包,意味着你具备了开发蓝牙产品的基础能力,能够游刃有余地应对各种蓝牙应用场景。

    iec9-2LE协议打包程序.zip_9-2le_IEC61850_iec61850-9-2LE协议开发

    在压缩包文件“iec9-2LE协议打包程序 .c”中,我们可以找到实现这些功能的源代码。通过对代码的分析和调试,开发者可以更好地理解9-2LE协议的细节,并根据实际需求进行定制和优化。 总结起来,IEC61850-9-2LE协议是...

    crc 异或和校验工具 虚拟串口 串口调试助手 通用单片机通讯协议 打包

    crc 异或和校验工具 虚拟串口 串口调试助手 通用单片机通讯协议 打包

    TCP/IP协议打包过程详细分析

    TCP/IP协议是互联网通信的基础,它定义了网络设备如何交换数据以及数据应该如何打包和解包。TCP/IP协议栈包括四个主要层次:应用层、传输层、网络层和数据链路层,每一层都有其特定的功能和协议。 1. **应用层**:...

    8583报文协议打包解包

    下面将详细阐述8583报文协议的结构、打包解包过程及其在实际应用中的重要性。 1. **8583报文结构** ISO8583报文由多个字段组成,每个字段都有固定长度或可变长度。报文分为三部分:头标(Header)、主消息体...

    5G标准协议最新R16版本物理层协议打包下载NR_38.2XX系列.rar

    最新5G物理层协议 38.2XX R16版本 38201-g00 38202-g00 38211-g00 38212-g00 38213-g00 38214-g00 38215-g01 截止 2020年3月25日

    北斗车载终端设备通信数据包协议打包和解析库

    北斗车载终端设备与平台通信协议(JTT808协议),高性能数据协议封包和解包库,配合Bouyei.NetFactory.dll支持粘包和分包解析

    消防主机协议列表_V1.0_20171116.pdf

    【消防主机协议列表_V1.0_20171116.pdf】这份文档是关于消防系统的通信协议集合,涵盖了多个知名品牌的消防主机及其不同的通信方式和地址映射方法。文档的更新历史反映了不同时间点对各主机协议的新增、修改和完善,...

    STM32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件

    详情参考:https://blog.csdn.net/vvoennvv/article/details/135175983 包括内容: 1,bootloader工程源码, 2,测试主程序工程源码 3,详细使用说明文档 4,支持Ymodem协议的上位机软件

    简单协议的打包和解包源代码,STM32F103RCT6单片机实现,将ADC采集的CO数据打包后通过串口发送出去

    简单协议的打包和解包源代码,STM32F103RCT6单片机实现,将ADC采集的CO数据打包后通过串口发送出去。数据包结构:包头+原数据+校验和+包尾。文件包含两个工程源代码,一个工程是打包源代码,一个工程是解包源代码,...

    linux下h264 RTP打包发送

    通过以上步骤,可以实现在Linux环境下将H264视频流以RTP协议打包并发送的功能。这不仅需要深入理解H264编码和RTP协议,还需要熟悉Linux系统编程和网络编程。在实际应用中,还需要考虑性能优化、安全性以及与其他系统...

    vs打包时许可协议的注意事项

    然而,在这一过程中,不少开发者可能会遇到一个看似简单却容易忽视的问题——许可协议在打包后的程序中无法正常显示。这不仅影响了用户体验,也可能导致法律合规性问题,因为许多软件分发平台要求明确展示软件的许可...

    北斗车载终端设备与平台通信协议(JTT808协议)高性能数据协议封包和解包库配合Bouyei.NetFactory.dll支持

    北斗车载终端设备与平台...北斗车载终端设备通信数据包协议打包和解析库,该库针对(JT/T808协议)进行解析和打包,使用该库需要先了解JT/T808协议和终端设备与服务端平台的通信流程;Bouyei.BdProto 项目基于.Netframe

    百度 wifi 协议 内部资料

    **百度WiFi协议详解** 在无线网络领域,WiFi协议扮演着至关重要的角色,它定义了设备如何连接、通信以及管理无线网络。"百度WiFi协议"可能是百度公司内部对WiFi技术进行优化或定制的一种专有实现,旨在提升其产品和...

    c#、.NET6实现websocket协议服务端demo,完整清晰的解析和打包示例

    7. **数据帧打包**:在发送数据时,你需要根据WebSocket协议打包数据帧。这涉及到设置适当的FIN、RSV、opcode标志,以及payload length和mask(如果需要的话)。 以上就是使用C#和.NET6实现WebSocket服务端的基本...

Global site tag (gtag.js) - Google Analytics