协议解析器

using UnityEngine;
using System.Collections;
using System.Text;
/*
 * 1. higher is First
 * 2. string add length
 **/
/// <summary>发送包</summary>
public class SendPackage
{
    private ArrayList send = new ArrayList();
    public int Length;
    public static int AccountID;
    public short protocolID;
    public SendPackage(short protocolNumber){
        protocolID = protocolNumber;
        addShort((short)0);
        addShort(protocolNumber);
        addInt(AccountID);
    }

    public void addByte(byte s) {
        send.Add(s);
    }

    public void addShort(short s) {
        send.Add((byte)((s & 0xff00) >> 8));
        send.Add((byte)(s & 0xff));
    }

    public void addInt(int s) {
         send.Add((byte) ((0xff000000 & s) >> 24));
        send.Add((byte) ((0xff0000 & s) >> 16));
        send.Add((byte) ((0xff00 & s) >> 8));
        send.Add((byte) (0xff & s));
    }
    public void addString(string s){
        byte[] str = Encoding.UTF8.GetBytes(s);
        short sl= (short)str.Length;
        addShort(sl);
        for(int i = 0; i < sl; i++){
            send.Add(str[i]);
        }
    }

    /// <summary>发送 是否触发发送事件</summary>
    public void Send(bool sm = true){
        Length = (short)(send.Count - 8);
        send[0] = (byte)((Length & 0xff00) >> 8);
        send[1] = (byte)(Length & 0xff);
        NetWorkManager.instance.SendSocket((byte[])send.ToArray (typeof(byte)), sm);
    }
}
using UnityEngine;
using System.Collections;
using System.Text;

public class ReceiveParse
{
    public int point = 0;
    public int length;
    public short protocolID;
    public int userId;
    public byte[] receiveSave;

    public ReceiveParse(byte[] receive)
    {
        receiveSave = receive;
        length = getShort();
        protocolID = getShort();
        userId = getInt();
        length += 8;
    }

    public byte getByte()
    {
        byte r = receiveSave[point];
        point += 1;
        return r;
    }

    public short getShort()
    {
        byte[] buf = new byte[2] {receiveSave[point + 1] , receiveSave[point + 0]};
        if (buf == null)
        {
           Debug.Log("getShort is Null!!");
        }
        if (buf.Length > 2)
        {
          Debug.Log("getShort is OverRide!!");
        }
        short r = 0;
        for (int i = buf.Length - 1; i >= 0; i--)
        {
            r <<= 8;
            r |= (short)(buf[i] & 0xff);
        }
        point += 2;
        return r;
      }

    public int getInt()
    {
        byte[] buf = new byte[4] { receiveSave[point + 3], receiveSave[point + 2], receiveSave[point + 1], receiveSave[point] };
        if (buf == null)
        {
           Debug.Log("getInt is Null!!");
        }
        if (buf.Length > 4)
        {
          Debug.Log("getInt is OverRide!!");
        }
        int r = 0;
           for (int i = buf.Length - 1; i >= 0; i--)
        {
            r <<= 8;
            r |= (buf[i] & 0xff);
         }
        point += 4;
        return r;
      }

    public long getLong()
    {
        byte[] buf = new byte[8] {receiveSave[point + 7], receiveSave[point + 6], receiveSave[point + 5] , receiveSave[point + 4],receiveSave[point + 3], receiveSave[point + 2], receiveSave[point + 1] , receiveSave[point]};
        if (buf == null)
        {
            Debug.Log("getInt is Null!!");
        }
        if (buf.Length > 8)
        {
            Debug.Log("getInt is OverRide!!");
        }
        long r = 0;
        for (int i = buf.Length - 1; i >= 0; i--)
        {
            r <<= 8;
            r |= (long)((long)buf[i] & 0xff);
        }
        point += 8;
        return r;
    }

    public string getString()
    {
        short lengh = getShort();
        byte[] buf = new byte[lengh];
        for(int i = 0; i < lengh; i++)
        {
            buf[i] = receiveSave[point + i];
        }
        point += lengh;
        return Encoding.UTF8.GetString(buf);
    }

}
ReceiveParse rd = new ReceiveParse(recvBytes); 

包解析

ReceiveParse rp = NetWorkManager.instance.GetReceive();
int id = rp.getShort();
int code = rp.getShort();

发包

SendPackage sp = new SendPackage(14000);
sp.addShort(1);
sp.addShort(5);
sp.Send();
时间: 2024-10-29 13:48:29

协议解析器的相关文章

通用轻量级二进制格式协议解析器

在通信协议中,经常碰到使用私有协议的场景,报文内容是肉眼无法直接看明白的二进制格式.由于协议的私有性质,即使大名鼎鼎的 Wireshark,要解析其内容,也无能为力. 面对这种情况,开发人员通常有两个办法:第一,对照报文内容和协议规范进行人工分析(假设内容没有经过加密.压缩):第二,编程实现协议报文的解析(源于程序员的懒惰 ^_^). 很明显,第二条道路是主流.目前比较常见的实现方式是开发对应的 Wireshark 插件,包括 C.Lua 等插件.当然,插件完成后需要运行 Wireshark 才

【wireshark】协议解析

1. 普通解析 Wireshark启动时,所有解析器进行初始化和注册.要注册的信息包括协议名称.各个字段的信息.过滤用的关键字.要关联的下层协议与端口(handoff)等.在解析过程,每个解析器负责解析自己的协议部分, 然后把上层封装数据传递给后续协议解析器,这样就构成一个完整的协议解析链条. 解析链条的最上端是Frame解析器,它负责解析pcap帧头.后续该调用哪个解析器,是通过上层协议注册handoff信息时写在当前协议的hash表来查找的. 例如,考虑ipv4解析器有一个hash表,里面存

[Python]HTML/XML解析器Beautiful Soup

[简介] Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.即HTML/XMLX的解析器. 它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作.它可以大大节省你的编程时间. [安装] 下载地址:点击打开链接 Linux平台安装: 如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装: $ apt-get install Python-bs4 B

解析器组合子

本文引自:http://www.ibm.com/developerworks/cn/java/j-lo-compose/ Ward Cunningham 曾经说过,干净的代码清晰地表达了代码编写者所想要表达的东西,而优美的代码则更进一步,优美的代码看起来就像是专门为了要解决的问题而存在的.在本文中,我们将展示一个组合式解析器的设计.实现过程,最终的代码是优美的,极具扩展性,就像是为了解析特定的语法而存在的.我们还会选取 H.248 协议中的一个例子,用上述的组合式解析器实现其语法解析器.读者在这

视音频数据处理入门:UDP-RTP协议解析

===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理入门:PCM音频采样数据处理 视音频数据处理入门:H.264视频码流解析 视音频数据处理入门:AAC音频码流解析 视音频数据处理入门:FLV封装格式解析 视音频数据处理入门:UDP-RTP协议解析 ===================================================

HTML 解析器 NSoup

NSoup是JSoup的Net移植版本.使用方法基本一致. jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据. jsoup的主要功能如下: 从一个URL,文件或字符串中解析HTML: 使用DOM或CSS选择器来查找.取出数据: 可操作HTML元素.属性.文本: jsoup是基于MIT协议发布的,可放心使用于商业项目.

i2c知识总结及协议解析

知识总结部分: 一. 技术性能: 工作速率有100K和400K两种: 支持多机通讯: 支持多主控模块,但同一时刻只允许有一个主控: 由数据线SDA和时钟SCL构成的串行总线: 每个电路和模块都有唯一的地址: 每个器件可以使用独立电源 二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线: 每次通讯以START开始,以STOP结束: 启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R. /W位为0表示由主控向被控器件写

MTK Http Socket GPRS以及解析器和下载器概述

MTK App网络应用介绍 MTK App网络开发步骤 GPRS网络注册模块 Socket联网API接口 HTTP功能部件 使用HTTP封装解析器和下载器 Parser Downloader 调试功能 应用需要使用的声明文件 配置功能 MTK平台组件介绍 Timer MTK App网络应用介绍 MTK手机App开发过去开发总是使用while循环嵌套来获取数据,而现在我们使用消息机制来完成Socket上网.本篇博客借手机里的天气应用来系统介绍MTK手机App连接上网所需要经历的步骤. MTK Ap

自己动手实现一个简单的JSON解析器

1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 web 应用开发领域内,得益于 JavaScript 对 JSON 提供的良好支持,JSON 要比 XML 更受开发人员青睐.所以作为开发人员,如果有兴趣的话,还是应该深入了解一下 JSON 相关的知识.本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析器的解析流