Common(二)—— CMemQueue

来源:互联网 发布:百度seo一本通pdf下载 编辑:程序博客网 时间:2024/06/11 20:26
目录为:Assets/Scripts/Common/CMemQueue.cs这个文件主要定义了一个队列.
using UnityEngine;using System;using System.Net;using System.Net.Sockets;using System.Threading;using System.IO;using JT.FWW.Tools;namespace JT{    namespace FWW    {        namespace Tools        {            //自定义的队列            public class CMemQueue            {                private MemoryStream m_msStream = null;                private UInt32 m_un32Size;                private UInt32 m_un32TailPos;                private UInt32 m_un32HeadPos;                //记录push了多长数据                private UInt64 m_un64DataPushed;                //记录pop了多长数据                private UInt64 m_un64DataPoped;                public CMemQueue(UInt32 un32Size)                {                    m_msStream = new MemoryStream((Int32)un32Size);                    m_un32Size = un32Size;                    m_un32TailPos = 0;                    m_un32HeadPos = 0;                    m_un64DataPushed = 0;                    m_un64DataPoped = 0;                }                public UInt32 GetSize()                {                    return m_un32Size;                }                public UInt64 GetCachedDataSize()                {                    return m_un64DataPushed - m_un64DataPoped;                }                public UInt64 GetPushedDataSize()                {                    return m_un64DataPushed;                }                public UInt64 GetPopedDataSize()                {                    return m_un64DataPoped;                }                public void Reset()                {                    m_un32TailPos = 0;                    m_un32HeadPos = 0;                    m_un64DataPushed = 0;                    m_un64DataPoped = 0;                }                //push data from pData with length un32Len into the memory queue.                public Int32 PushBack(byte[] abByteStream, UInt32 un32Len)                {                    //这行代码可以改为:UInt32 un32Dist = m_un32TailPos - m_un32HeadPos + m_un32Size                    //这样子更便于理解                    UInt32 un32Dist = m_un32TailPos + m_un32Size - m_un32HeadPos;                    //un32Used:代表已经使用了的容量                    UInt32 un32Used = (un32Dist >= m_un32Size ? (un32Dist - m_un32Size) : un32Dist);                    //如果加上要push进的容量超出queue的容量则返回-1                    if (un32Len + un32Used + 1 > (UInt32)m_un32Size)                    {                        return -1;                    }                    //队尾加上新增数据长度大于queue的size时                    if (m_un32TailPos + un32Len >= m_un32Size)                    {                        //un32Seg1:队尾到queue最末尾还剩余的容量                        UInt32 un32Seg1 = (UInt32)(m_un32Size - m_un32TailPos);                        //要push进来的数据在tail到达queue末尾时还未存放的部分的长度                        UInt32 un32Seg2 = un32Len - un32Seg1;                        //处理位置指定到队尾                        m_msStream.Seek(m_un32TailPos, SeekOrigin.Begin);                        //写进un32Seg1长度的数据,此时queue末尾已经装满,数据还剩下un32Seg2长度未存储                        m_msStream.Write(abByteStream, 0, (Int32)un32Seg1);                        //处理位置回到queue最初的位置                        m_msStream.Seek(0, SeekOrigin.Begin);                        //注意:此处un32Seg1表示的是从abByteStream的un32Seg1开始读取                        //这行代码表示把abByteStream未存储的那部分数据从queue最初的位置开始写入                        m_msStream.Write(abByteStream, (Int32)un32Seg1, (Int32)un32Seg2);                        //这样就是循环了,循环队列                        m_un32TailPos = un32Seg2;                    }                    else                    {                        //这里就是直接从tail开始push数据                        m_msStream.Seek(m_un32TailPos, SeekOrigin.Begin);                        m_msStream.Write(abByteStream, 0, (Int32)un32Len);                        m_un32TailPos += un32Len;                    }                    m_un64DataPushed += un32Len;                    return 0;                }                //pop un32Len byte data from header to pBuf which would move read pointer.                public Int32 PopFront(byte[] abByteStream, UInt32 un32Len)                {                    //和上面push函数里面的一样                    UInt32 un32Dist = m_un32TailPos + m_un32Size - m_un32HeadPos;                    UInt32 un32Used = (un32Dist >= m_un32Size ? (un32Dist - m_un32Size) : un32Dist);                    //要pop出去的数据长度当然不能超过当前queue里存放的数据的长度                    if (un32Len > un32Used)                    {                        return -1;                    }                    //这里就是上面push函数里数据分开,一部分在queue末尾位置,一部分在queue初始位置的情况                    if (m_un32HeadPos + un32Len >= m_un32Size)                    {                        //要pop的数据的第一部分的长度                        UInt32 un32Seg1 = (UInt32)(m_un32Size - m_un32HeadPos);                        //要pop的数据的第二部分的长度                        UInt32 un32Seg2 = un32Len - un32Seg1;                        m_msStream.Seek(m_un32HeadPos, SeekOrigin.Begin);                        //把第一部分写进abByteStream                        m_msStream.Read(abByteStream, 0, (Int32)un32Seg1);                        m_msStream.Seek(0, SeekOrigin.Begin);                        //un32Seg1表示abByteStream的offset                        //把第二部分写进abByteStream                        m_msStream.Read(abByteStream, (Int32)un32Seg1, (Int32)un32Seg2);                        //更新头指针                        m_un32HeadPos = un32Seg2;                    }                    else                    {                        //最普通的pop情况                        m_msStream.Seek(m_un32HeadPos, SeekOrigin.Begin);                        m_msStream.Read(abByteStream, 0, (Int32)un32Len);                        m_un32HeadPos += un32Len;                    }                    m_un64DataPoped += un32Len;                    return 0;                }                //get un32Len byte data from header to pBuf which do not move read pointer.                //get数据但是不pop数据                public Int32 GetFront(byte[] abByteStream, UInt32 un32Len)                {                    UInt32 un32Dist = m_un32TailPos + m_un32Size - m_un32HeadPos;                    UInt32 un32Used = (un32Dist >= m_un32Size ? (un32Dist - m_un32Size) : un32Dist);                    if (un32Len > un32Used)                    {                        return -1;                    }                    if (m_un32HeadPos + un32Len >= m_un32Size)                    {                        UInt32 un32Seg1 = (UInt32)(m_un32Size - m_un32HeadPos);                        UInt32 un32Seg2 = un32Len - un32Seg1;                        m_msStream.Seek(m_un32HeadPos, SeekOrigin.Begin);                        m_msStream.Read(abByteStream, 0, (Int32)un32Seg1);                        m_msStream.Seek(0, SeekOrigin.Begin);                        m_msStream.Read(abByteStream, (Int32)un32Seg1, (Int32)un32Seg2);                        //m_un32HeadPos = un32Seg2;                    }                    else                    {                        m_msStream.Seek(m_un32HeadPos, SeekOrigin.Begin);                        m_msStream.Read(abByteStream, 0, (Int32)un32Len);                        //m_un32HeadPos += un32Len;                    }                    //m_un64DataPoped += un32Len;                    return 0;                }            }        }    }}
原创粉丝点击