Common (一)—— CMemBuffer

文件目录为:
Assets/Scripts/Common/目录下
CMemBuffer.cs
这个文件里主要定义了一种二进制的保存结构,来把需要的数据保存成二进制数据。一般先是Header,然后是datablock。具体的header占多少字节之类的则是在具体用的地方才定义的。
using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using JT.FWW.Tools;
using System.Text;

namespace JT
{
    namespace FWW
    {
        namespace Tools
        {
            public class CMemBuffer
            {
                //buffer大小
                private Int32 m_n32BufferSize = 0;
                private MemoryStream m_msStream = null;
                private Int32 m_n32ReadPos = 0;
                private Int32 m_n32WritePos = 0;

                //构造函数,初始化
                public CMemBuffer(Int32 n32Size)
                {
                    this.m_msStream = new MemoryStream((Int32)n32Size);
                    this.m_n32BufferSize = n32Size;
                }

                public Int32 ReadPos
                {
                    get { return m_n32ReadPos; }
                    set { m_n32ReadPos = value; }
                }

                public Int32 WritePos
                {
                    get { return m_n32WritePos; }
                    set { m_n32WritePos = value; }
                }

                public byte[] GetMemBuffer()
                {
                    return this.m_msStream.GetBuffer();
                }

                public Int32 GetBufferSize()
                {
                    return this.m_n32BufferSize;
                }

                public Int32 GetWritePos()
                {
                    return this.m_n32WritePos;
                }

                public Int32 GetReadPos()
                {
                    return this.m_n32ReadPos;
                }

                public Int32 AddWritePos(Int32 n32AddSize)
                {
                    if (this.m_n32BufferSize >= this.m_n32WritePos + n32AddSize)
                    {
                        this.m_n32WritePos += n32AddSize;
                    }
                    return this.m_n32WritePos;
                }

                public Int32 AddReadPos(Int32 n32AddSize)
                {
                    if (this.m_n32BufferSize >= this.m_n32ReadPos + n32AddSize)
                    {
                        this.m_n32ReadPos += n32AddSize;
                    }
                    return this.m_n32ReadPos;
                }

                public void SetReadPos(Int32 n32NewPos)
                {
                    this.m_n32ReadPos = n32NewPos;
                }

                public void SetWritePos(Int32 n32NewPos)
                {
                    this.m_n32WritePos = n32NewPos;
                }

                public Int32 Resize(Int32 n32NewSize)
                {
                    //check parameter.
                    if (n32NewSize <= 0)
                    {
                        return 0;
                    }
                    if (this.m_n32WritePos >= n32NewSize)
                    {
                        return 0;
                    }

                    //really resize the buffer.
                    //this.m_msStream.SetLength(n32NewSize);

                    MemoryStream msOld = this.m_msStream;
                    this.m_msStream = new MemoryStream((Int32)(n32NewSize));
                    this.m_n32BufferSize = n32NewSize;
                    //msOld.Seek(0 , SeekOrigin.Begin);
                    this.m_msStream.Seek(0, SeekOrigin.Begin);
                    this.m_msStream.Write(msOld.GetBuffer(), 0, (Int32)this.m_n32WritePos);

                    return n32NewSize;
                }

                public Boolean ReWrite(Int32 n32Pos, byte[] arrbData, Int32 n32Size)
                {
                    //check parameters.
                    if (n32Size + n32Pos > this.m_n32BufferSize)
                    {
                        return false;
                    }

                    //copy data.
                    this.m_msStream.Seek(n32Pos, SeekOrigin.Begin);
                    this.m_msStream.Write(arrbData, 0, (Int32)n32Size);
                    return true;
                }

                private void AddData(byte[] arrByteStream, Int32 n32Size)
                {
                    //check the stream size.
                    if (this.m_n32BufferSize <= this.m_n32WritePos + n32Size)
                    {
                        Int32 n32IncrementSize = n32Size * 2;
                        this.Resize(this.m_n32BufferSize + n32IncrementSize);
                    }

                    //write the data.
                    this.m_msStream.Seek(this.m_n32WritePos, SeekOrigin.Begin);
                    this.m_msStream.Write(arrByteStream, 0, (Int32)n32Size);
                    this.m_n32WritePos += n32Size;
                }

                public void Add(Boolean blValue)
                {
                    Int32 n32TypeSize = sizeof(Boolean);
                    byte[] arrByteStream = BitConverter.GetBytes(blValue);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(byte bValue)
                {
                    Int32 n32TypeSize = sizeof(byte);
                    byte[] arrByteStream = BitConverter.GetBytes(bValue);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(char nchValue)
                {
                    Int32 n32TypeSize = sizeof(char);

                    byte[] arrByteStream = BitConverter.GetBytes(nchValue);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(UInt16 n16Value)
                {
                    Int32 n32TypeSize = sizeof(UInt16);
                    byte[] arrByteStream = BitConverter.GetBytes(n16Value);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(Int16 n16Value)
                {
                    Int32 n32TypeSize = sizeof(Int16);
                    byte[] arrByteStream = BitConverter.GetBytes(n16Value);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(UInt32 un32Value)
                {
                    Int32 n32TypeSize = sizeof(UInt32);
                    byte[] arrByteStream = BitConverter.GetBytes(un32Value);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(Int32 n32Value)
                {
                    Int32 n32TypeSize = sizeof(Int32);
                    byte[] arrByteStream = BitConverter.GetBytes(n32Value);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(UInt64 n64Value)
                {
                    Int32 n32TypeSize = sizeof(UInt64);
                    byte[] arrByteStream = BitConverter.GetBytes(n64Value);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(Int64 n64Value)
                {
                    Int32 n32TypeSize = sizeof(Int64);
                    byte[] arrByteStream = BitConverter.GetBytes(n64Value);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(float fValue)
                {
                    Int32 n32TypeSize = sizeof(float);
                    byte[] arrByteStream = BitConverter.GetBytes(fValue);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(double dValue)
                {
                    Int32 n32TypeSize = sizeof(double);
                    byte[] arrByteStream = BitConverter.GetBytes(dValue);
                    this.AddData(arrByteStream, (Int32)n32TypeSize);
                }

                public void Add(string strValue)
                {
                    ////Int32  n32TypeSize = sizeof(char);
                    //Int32 n32Index = strValue.IndexOf('\0');
                    //if (-1 != n32Index)
                    //{
                    //    strValue = strValue.Substring(0, n32Index);
                    //}
                    //char[] arrch = strValue.ToCharArray();
                    //for (Int32 i = 0; i < strValue.Length; i++)
                    //{
                    //    this.Add(arrch[i]);
                    //}
                    //this.Add('\0');
                    for (Int32 i = 0; i < strValue.Length; i++)
                    {
                        Add(strValue[i]);
                    }
                    Add('\0');
                }

                //让string占据固定的长度,而不是string本身的长度
                public void Add(string strValue, UInt32 un32FixSize)
                {
                    for (UInt32 i = 0; i < un32FixSize; i++)
                    {
                        if (i < strValue.Length)
                        {
                            Add(strValue[(Int32)i]);
                        }
                        else
                        {
                            Add('\0');
                        }
                    }
                }

                public void Add(char[] arrchValue, Int32 n32Size)
                {
                    //this.AddData((byte[])arrchValue , n32Size);
                    for (Int32 i = 0; i < n32Size; i++)
                    {
                        this.Add(arrchValue[i]);
                    }
                    //this.Add('\0');
                }

                public void Add(byte[] arrbData, Int32 n32Offset, Int32 n32Size)
                {
                  // this.AddData(arrbData[i + n32Offset] , n32Size);

                    for (Int32 i = 0; i < n32Size; i++)
                    {
                        if(i >= arrbData.Length){
                            this.Add((byte)0);
                        }
                        else{
                            this.Add(arrbData[i + n32Offset]);
                        }

                    }
                }

                public Boolean GetBoolean()
                {
                    Boolean bValue = BitConverter.ToBoolean(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(Boolean);
                    return bValue;
                }

                public byte GetByte()
                {
                    this.m_msStream.Seek(this.m_n32ReadPos, SeekOrigin.Begin);
                    byte bValue = Convert.ToByte(this.m_msStream.ReadByte());
                    this.m_n32ReadPos++;
                    return bValue;
                }

                public char GetChar()
                {
                    char chValue = BitConverter.ToChar(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(char);
                    return chValue;
                }

                public UInt16 GetUInt16()
                {
                    UInt16 n16Value = BitConverter.ToUInt16(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(UInt16);
                    return n16Value;
                }

                public Int16 GetInt16()
                {
                    Int16 n16Value = BitConverter.ToInt16(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(Int16);
                    return n16Value;
                }

                public UInt32 GetUInt32()
                {
                    UInt32 un32Value = BitConverter.ToUInt32(this.m_msStream.GetBuffer(), this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(UInt32);
                    return un32Value;
                }

                public Int32 GetInt32()
                {
                    Int32 n32Value = BitConverter.ToInt32(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(Int32);
                    return n32Value;
                }

                public UInt64 GetUInt64()
                {
                    UInt64 n64Value = BitConverter.ToUInt64(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(UInt64);
                    return n64Value;
                }

                public Int64 GetInt64()
                {
                    Int64 n64Value = BitConverter.ToInt64(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(Int64);
                    return n64Value;
                }

                public float GetFloat()
                {
                    float nValue = BitConverter.ToSingle(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(float);
                    return nValue;
                }

                public double GetDouble()
                {
                    double dValue = BitConverter.ToDouble(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    this.m_n32ReadPos += sizeof(double);
                    return dValue;
                }

                public bool GetBytesArray(byte[] arrBData, Int32 n32GetSize)
                {
                    if (this.m_n32ReadPos + n32GetSize > this.m_n32WritePos)
                    {
                        return false;
                    }
                    this.m_msStream.Seek(this.m_n32ReadPos, SeekOrigin.Begin);
                    this.m_msStream.Read(arrBData, 0, (Int32)n32GetSize);
                    this.m_n32ReadPos += n32GetSize;
                    return true;
                }

                public bool GetCharArray(char[] arrch, Int32 n32CharArrayLen)
                {
                    //char[] arrch = new Char[n32CharArrayLen];
                    if (this.m_n32ReadPos + n32CharArrayLen * sizeof(char) > this.m_n32WritePos)
                    {
                        return false;
                    }
                    for (Int32 i = 0; i < n32CharArrayLen; i++)
                    {
                        arrch[i] = this.GetChar();
                    }
                    return true;
                }

                public string GetString(Int32 n32FixLen)
                {
                    //char chValue = BitConverter.ToChar(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    //string myTempStr = new string(chValue);
                    //string myTempStr = new string('\0');
                    //Int32 n32Index = 0;
                    //while ((this.m_n32ReadPos + sizeof(char)) < this.m_n32WritePos && myChar != '\0')
                    //{
                    //    myTempStr[n32Index] = GetChar();
                    //    n32Index++;
                    //}
                    //return myTempStr;

                    //string  myStr = BitConverter.ToString(this.m_msStream.GetBuffer() , (Int32)this.m_n32ReadPos);
                    //this.m_n32ReadPos += sizeof(char) * (Int32)myStr.Length;
                    //char  myChar = this.GetChar();

                    //char [] arrch = BitConverter.ToString(this.m_msStream.GetBuffer() , (Int32)this.m_n32ReadPos).ToCharArray();
                    //string  myStr = new  string(arrch);

                    //char[] arrch = new char[1];
                    //arrch[0] = this.GetChar();
                    //string  myStr = new string(arrch);

                    // char chValue = BitConverter.ToChar(this.m_msStream.GetBuffer(), (Int32)this.m_n32ReadPos);
                    //string cstrTemp = new string((char[])m_msStream.GetBuffer()), (Int32)this.m_n32ReadPos);

                    Int32 n32TempLen = n32FixLen;
                    if (0 == n32TempLen)
                    {
                        n32TempLen = 100;
                    }
                    Int32 n32GetLen = 0;
                    StringBuilder cSB = new StringBuilder(n32TempLen);
                    char myChar = this.GetChar();
                    n32GetLen++;
                    while ('\0' != myChar)
                    {
                        cSB.Append(myChar);
                        myChar = this.GetChar();
                        n32GetLen++;
                        if (n32FixLen > 0 && n32GetLen >= n32FixLen)
                        {
                            break;
                        }
                    }

                    if (n32FixLen > 0 && n32GetLen < n32FixLen)
                    {
                        Int32 n32AddWritePos = n32FixLen - n32GetLen;
                        m_n32WritePos += n32AddWritePos;
                    }

                    return cSB.ToString();

                    //Int32 n32InsertPos = 1;
                    //while ((this.m_n32ReadPos + sizeof(char)) < this.m_n32WritePos && myChar != '\0')
                    //{
                    //    //myStr = myStr + arrch[0].ToString();
                    //    //myStr.Insert(n32InsertPos , arrch[0].ToString());
                    //    //n32InsertPos++;
                    //    //arrch[0] = this.GetChar();  
                    //    n32InsertPos++;
                    //    myChar = this.GetChar();
                    //}
                    ////this.AddReadPos(-n32InsertPos * sizeof(char));
                    //this.SetReadPos(this.GetReadPos() - n32InsertPos * sizeof(char));
                    //char[] arrch = new char[n32InsertPos];
                    //for (Int32 i = 0; i < n32InsertPos; i++)
                    //{
                    //    arrch[i] = this.GetChar();
                    //}
                    //return new string(arrch);
                }



                public string GetString()
                {
                    StringBuilder cSB = new StringBuilder(10);
                    char myChar = this.GetChar();

                    while ('\0' != myChar)
                    {
                        cSB.Append(myChar);
                        myChar = this.GetChar();
                    }

                    return cSB.ToString();
                }
            }

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值