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; } } } }}
阅读全文
0 0
- Common(二)—— CMemQueue
- Common(五)—— 消息系统(二):如何使用
- AJAX技术(二)common class
- common-lang类的学习(二)
- apache--common 常用组件实例(二)
- caffe源码阅读(二) common
- Common(三)—— CMsg
- Common(四)—— Protocal
- Common(六)—— 单例
- Common(七)—— NetworkManager
- Common(九)—— BeatFlyMotion
- Common(十一)—— FadeInOut
- Common(十二)—— JXML
- OpenGL ES 基本知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 点基础知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 坐标变换——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 缓存对象——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- 光栅化基础知识——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)
- Matlab 使用技巧
- 在学习GraytHatPython构建Window调试器过程中遇到的问题
- 1002. 后缀表达式计算
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 引发的血案
- android监听View加载完成
- Common(二)—— CMemQueue
- google-chrome 启动报错 nss_util.cc(627)] NSS_VersionCheck("3.26") failed. NSS >= 3.26 is required
- React Native布局详细指南
- Leetcode: 13. Roman to Integer(Week2, Easy)
- 第4章 随机变量的数字特征
- Java学习之“凯撒密码”实例
- 垃圾收集器
- Android虚拟机多开检测
- mysql高级笔记(二)