博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 数据封装和解析
阅读量:1983 次
发布时间:2019-04-27

本文共 9485 字,大约阅读时间需要 31 分钟。

/// /// 数据封装和解析类/// 作者:林新发/// using UnityEngine;using System.Collections;using System.Collections.Generic;using System.Text;using System;public class NetBitStream {    //****************************************Write*********************************************//    ///     /// 写字节    ///     /// 写入的字节    public void WriteByte(byte bt)    {        WriteData(enDataType.en_byte,bt);    }    ///     /// 写字节流    ///     /// 写入的字节流    /// 长度,单位字节    public void WriteBytes(byte[] bts, int len)    {        if (_bodyLength + BYTE_LEN * len > MAX_BODY_LENGTH) return;        for (int i = 0; i < len; ++i)        {            _bytes[_bodyLength] = bts[i];            _bodyLength += BYTE_LEN;        }    }    ///     /// 写bool    ///     /// bool值    public void WriteBool(bool flag)    {        byte b = (byte)1;        if (!flag) b = (byte)0;        WriteData(enDataType.en_byte,b);    }    ///     /// 写int    ///     /// int值    public void WriteInt32(int num)    {       WriteData(enDataType.en_int32,num);    }    ///     /// 写uint    ///     /// uint值    public void WriteUInt32(uint num)    {        WriteData(enDataType.en_uint32,num);    }    public void WriteShort(short num)    {        WriteData(enDataType.en_short,num);    }    public void WriteFloat(float num)    {       WriteData(enDataType.en_float,num);    }    public void WriteInt64(Int64 num)    {        WriteData(enDataType.en_int64, num);    }    public void WriteUInt64(UInt64 num)    {        WriteData(enDataType.en_uint64, num);    }    public void WriteDouble(double num)    {        WriteData(enDataType.en_double, num);    }    private void WriteData(enDataType dataType,object data)    {        ushort dataSize=0;        byte[] bs=new byte[]{};        switch(dataType)        {            case enDataType.en_byte:                dataSize=BYTE_LEN;                bs = System.BitConverter.GetBytes((byte)data);                break;            case enDataType.en_short:                dataSize=SHORT16_LEN;                bs = System.BitConverter.GetBytes((ushort)data);                break;            case enDataType.en_ushort:                dataSize=SHORT16_LEN;                bs = System.BitConverter.GetBytes((short)data);                break;            case enDataType.en_int32:                 dataSize=INT32_LEN;                bs = System.BitConverter.GetBytes((int)data);                break;            case enDataType.en_uint32:                 dataSize=INT32_LEN;                bs = System.BitConverter.GetBytes((uint)data);                break;            case enDataType.en_float:                dataSize=INT32_LEN;                bs = System.BitConverter.GetBytes((float)data);                break;            case enDataType.en_double:                dataSize=DOUBLE_LEN;                bs = System.BitConverter.GetBytes((double)data);                break;            case enDataType.en_int64:                dataSize=DOUBLE_LEN;                bs = System.BitConverter.GetBytes((Int64)data);                break;            case enDataType.en_uint64:                dataSize=DOUBLE_LEN;                bs = System.BitConverter.GetBytes((UInt64)data);                break;        }        if (_bodyLength + dataSize > MAX_BODY_LENGTH) return;        Array.Copy(bs, 0, _bytes, _bodyLength, dataSize);        _bodyLength += dataSize;    }    public void WriteString(string str,bool isUtf8=true)    {        if (str == null) return;        ushort len = isUtf8 ? (ushort)System.Text.Encoding.UTF8.GetByteCount(str) :            (ushort)System.Text.Encoding.GetEncoding("GB2312").GetByteCount(str);        if (_bodyLength + len > MAX_BODY_LENGTH) return;        System.Text.Encoding.GetEncoding("GB2312").GetBytes(str, 0, str.Length,            _bytes, _bodyLength);        _bodyLength += len;    }    public void WriteStringWithLen(string str,ushort len,bool isUtf8=true)    {        if (str == null)        {            WriteZero((ushort)len);            return;        }        ushort strlen = isUtf8 ? (ushort)System.Text.Encoding.UTF8.GetByteCount(str) :            (ushort)System.Text.Encoding.GetEncoding("GB2312").GetByteCount(str);        if (strlen > len) return;        WriteString(str, isUtf8);        ushort zeroCnt = (ushort)(len - strlen);        WriteZero(zeroCnt);    }    public void WriteZero(ushort zeroCnt)    {        byte zero = (byte)0;        for (ushort i = 0; i < zeroCnt; ++i)        {            WriteByte(zero);        }    }        //****************************************Read*********************************************//    public void ReadByte(out byte bt)    {        bt = 0;        if (_bodyLength + BYTE_LEN > MAX_BODY_LENGTH) return;        bt = _bytes[_bodyLength];        _bodyLength += BYTE_LEN;    }    public void ReadBool(out bool flag)    {        flag = false;        if (_bodyLength + BYTE_LEN > MAX_BODY_LENGTH) return;        byte bt = _bytes[_bodyLength];        if (bt == (byte)1) flag = true;        else flag = false;        _bodyLength += BYTE_LEN;    }    public void ReadInt32(out int num)    {        object objNum;        ReadData(enDataType.en_int32, out objNum);        num = (int)objNum;    }    public void ReadUInt32(out uint num)    {        object objNum;        ReadData(enDataType.en_uint32, out objNum);        num = (UInt32)objNum;    }    public void ReadShort(out short num)    {        object objNum;        ReadData(enDataType.en_short, out objNum);        num = (short)objNum;    }    public void ReadUShort(out ushort num)    {        object objNum;        ReadData(enDataType.en_ushort, out objNum);        num = (ushort)objNum;    }    public void ReadInt64(out Int64 num)    {        object objNum;        ReadData(enDataType.en_int64, out objNum);        num = (Int64)objNum;    }    public void ReadUInt64(out UInt64 num)    {        object objNum;        ReadData(enDataType.en_uint64, out objNum);        num = (UInt64)objNum;    }    public void ReadDouble(out double num)    {        object objNum;        ReadData(enDataType.en_double, out objNum);        num = (double)objNum;    }    public void ReadFloat(out float num)    {        object objNum;        ReadData(enDataType.en_float, out objNum);        num = (float)objNum;    }    public void ReadString(out string str, ushort len,bool isUtf8)    {        str = "";        if (_bodyLength + len > MAX_BODY_LENGTH) return;        str=isUtf8?System.Text.Encoding.UTF8.GetString(_bytes,_bodyLength,(int)len):            System.Text.Encoding.GetEncoding("GBK").GetString(_bytes,_bodyLength,(int)len);        if(str.Contains("\0"))        {            int endPos=str.IndexOf('\0');            str=str.Substring(0,endPos);        }    }    public void JumpByte(ushort jumpCnt)    {        _bodyLength += jumpCnt;    }    private void ReadData(enDataType dataType, out object data)    {        ushort dataSize = 0;        data = 0;        switch (dataType)        {            case enDataType.en_byte:                dataSize = BYTE_LEN;                data = _bytes[_bodyLength];                break;            case enDataType.en_short:                dataSize = SHORT16_LEN;                data = System.BitConverter.ToInt16(_bytes,_bodyLength);                break;            case enDataType.en_ushort:                dataSize = SHORT16_LEN;                data = System.BitConverter.ToUInt16(_bytes, _bodyLength);                break;            case enDataType.en_int32:                dataSize = INT32_LEN;                data = System.BitConverter.ToInt32(_bytes, _bodyLength);                break;            case enDataType.en_uint32:                dataSize = INT32_LEN;                data = System.BitConverter.ToUInt32(_bytes, _bodyLength);                break;            case enDataType.en_float:                dataSize = INT32_LEN;                data = System.BitConverter.ToSingle(_bytes, _bodyLength);                break;            case enDataType.en_double:                dataSize = DOUBLE_LEN;                data = System.BitConverter.ToDouble(_bytes, _bodyLength);                break;            case enDataType.en_int64:                dataSize = DOUBLE_LEN;                data = System.BitConverter.ToInt64(_bytes, _bodyLength);                break;            case enDataType.en_uint64:                dataSize = DOUBLE_LEN;                data = System.BitConverter.ToUInt64(_bytes, _bodyLength);                break;        }        if (_bodyLength + dataSize > MAX_BODY_LENGTH) return;        _bodyLength += dataSize;    }    public void CopyBytes(byte[] bs, ushort len)    {        if (len > MAX_BODY_LENGTH)            return;        Array.Copy(bs, 0, _bytes,0, len);    }    public NetBitStream()    {        _bodyLength = 0;        _bytes = new byte[MAX_BODY_LENGTH];    }    public byte[] BYTES    {        get { return _bytes; }        set { _bytes = value; }    }    public ushort BodyLength    {        get { return _bodyLength; }    }    private const int MAX_BODY_LENGTH = 2048;    //数据长度//    private const ushort BYTE_LEN = 1;    private const ushort SHORT16_LEN = 2;    private const ushort INT32_LEN = 4;    private const ushort FLOAT_LEN = 4;    private const ushort DOUBLE_LEN = 8;    private const ushort INT64_LEN = 8;    private enum enDataType    {        en_byte,        en_short,        en_ushort,        en_int32,        en_uint32,        en_int64,        en_uint64,        en_float,        en_double    }        private byte[] _bytes = null;    private ushort _bodyLength = 0;}

转载地址:http://ygzvf.baihongyu.com/

你可能感兴趣的文章
tensorflow使用tensorboard进行可视化
查看>>
神经网络调参实战(二)—— activation & initializer & optimizer
查看>>
凸优化 convex optimization
查看>>
数据库索引 & 为什么要对数据库建立索引 / 数据库建立索引为什么会加快查询速度
查看>>
IEEE与APA引用格式
查看>>
research gap
查看>>
pytorch训练cifar10数据集查看各个种类图片的准确率
查看>>
Python鼠标点击图片,获取点击点的像素坐标
查看>>
路径规划(一) —— 环境描述(Grid Map & Feature Map) & 全局路径规划(最优路径规划(Dijkstra&A*star) & 概率路径规划(PRM&RRT))
查看>>
神经网络调参实战(四)—— 加深网络层次 & 批归一化 batch normalization
查看>>
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(1)—— 假设检验(μ&卡方检验&方差检验(F检验))&相关系数(皮尔逊&斯皮尔曼)
查看>>
RRT算法(快速拓展随机树)的Python实现
查看>>
路径规划(二) —— 轨迹优化(样条法) & 局部规划(人工势能场法) & 智能路径规划(生物启发(蚁群&RVO) & 强化学习)
查看>>
D*算法
查看>>
强化学习(四) —— Actor-Critic演员评论家 & code
查看>>
RESTful API
查看>>
优化算法(四)——粒子群优化算法(PSO)
查看>>
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(2)——回归分析(最小二乘法&决定系数&残差不相关)&主成分分析&奇异值分解
查看>>
数据在Oracle中的存储
查看>>
优化算法(五)—人工蜂群算法Artificial Bee Colony Algorithm(ABC)
查看>>