/// <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;
}
C# 数据封装和解析
最新推荐文章于 2021-07-17 10:23:14 发布