C# 数据封装和解析
发布日期:2021-06-30 19:37:51
浏览次数:2
分类:技术文章
本文共 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;}
转载地址:https://linxinfa.blog.csdn.net/article/details/46471783 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月08日 01时05分44秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Network Compression网络压缩(一)
2019-04-30
GAN系列(零)—— GAN的发展(两条路线)
2019-04-30
Conditional GAN (CGAN) 条件生成网络
2019-04-30
强化学习(三) —— Policy Gradient 策略梯度
2019-04-30
docker安装oracle(win10)
2019-04-30
Cloudera Quickstart & HUE
2019-04-30
HUE
2019-04-30
CDH
2019-04-30
行为树 BT
2019-04-30
Cassandra & CQL
2019-04-30
Oracle数据库
2019-04-30
Oracle数据库命令
2019-04-30
plsql
2019-04-30
有限状态机FSM
2019-04-30
Win10 Docker
2019-04-30
Python绘制动画并保存为gif/mp4 (matplotlib)
2019-04-30
PRM概率路线图
2019-04-30
ROS(六)——订阅者Subscriber的编程实现(C++ & Python)
2019-04-30
ROS(七)——话题消息的定义与使用
2019-04-30
yolov3入门实战
2019-04-30