C# 数据封装和解析

18 篇文章 6 订阅
/// <summary>
/// 数据封装和解析类
/// 作者:林新发
/// </summary>
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System;


public class NetBitStream 
{


    //****************************************Write*********************************************//
    /// <summary>
    /// 写字节
    /// </summary>
    /// <param name="bt">写入的字节</param>
    public void WriteByte(byte bt)
    {
        WriteData(enDataType.en_byte,bt);
    }


    /// <summary>
    /// 写字节流
    /// </summary>
    /// <param name="bts">写入的字节流</param>
    /// <param name="len">长度,单位字节</param>
    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;
        }
    }


    /// <summary>
    /// 写bool
    /// </summary>
    /// <param name="flag">bool值</param>
    public void WriteBool(bool flag)
    {
        byte b = (byte)1;
        if (!flag) b = (byte)0;
        WriteData(enDataType.en_byte,b);
    }


    /// <summary>
    /// 写int
    /// </summary>
    /// <param name="num">int值</param>
    public void WriteInt32(int num)
    {
       WriteData(enDataType.en_int32,num);
    }


    /// <summary>
    /// 写uint
    /// </summary>
    /// <param name="num">uint值</param>
    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;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值