c# 里面写了一个 FIFO 类, 传递数据非常实用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZicoxPrintTestTool
{
    class Fifo
    {
        public Int32 m_WritePos;
        public Int32 m_ReadPos;
        private byte[] FifoBuf;
        private Int32 FifoBufMax;
        public Fifo(ref byte[] buf,Int32 bufmax)
        {
            m_WritePos = 0;
            m_ReadPos = 0;
            FifoBufMax = bufmax;
            FifoBuf = buf;
        }
        public bool Fifo_PutCh(byte ch)
        {
            Int32 wrpos, rdpos;
            wrpos = m_WritePos;
            rdpos = m_ReadPos;
            if (wrpos + 1 == rdpos) return false;
            FifoBuf[wrpos++] = ch;
            if (wrpos >= FifoBufMax) wrpos = 0;
            m_WritePos = wrpos;
            return true;
        }
        public bool Fifo_GetCh(ref byte ch)
        {
            Int32 wrpos, rdpos;
            wrpos = m_WritePos;
            rdpos = m_ReadPos;
            if (rdpos == wrpos) return false;
            ch = FifoBuf[rdpos++];
            if (rdpos >= FifoBufMax) rdpos = 0;
            m_ReadPos = rdpos;
            return true;
        }
        public Int32 Fifo_GetSize()
        {
            Int32 r;
            Int32 wrpos, rdpos;
            wrpos = m_WritePos;
            rdpos = m_ReadPos;
            if (wrpos >= rdpos) r = wrpos - rdpos;
            else r = FifoBufMax - rdpos + wrpos;
            return r;
        }
        public Int32 Fifo_GetFreeSize()
        {
            Int32 wrpos, rdpos;
            wrpos = m_WritePos;
            rdpos = m_ReadPos;
            if (rdpos >= wrpos) return (rdpos - wrpos);
            else return (FifoBufMax - wrpos + rdpos);
        }
    
        public Int32 Fifo_Read(ref byte[] outbuf,Int32 maxlen)
        {
            Int32 i,len, wrpos, rdpos, temp;
            wrpos = m_WritePos;
            rdpos = m_ReadPos;
            if (wrpos >= rdpos) len = wrpos - rdpos;
            else len = FifoBufMax - rdpos + wrpos;
            if (len > maxlen) len = maxlen;
            if ((rdpos + len )<= FifoBufMax)
            {
                for(i=0;i<len;i++) outbuf[i]=FifoBuf[i+rdpos];
                rdpos += len;
                if (rdpos + len == FifoBufMax) rdpos = 0;
            }
            else
            {
                temp = FifoBufMax - rdpos;
                for(i=0;i<temp;i++) outbuf[i]=FifoBuf[i+rdpos];
                for (i = 0;i<(len-(FifoBufMax-rdpos));i++) outbuf[i+temp] = FifoBuf[i];
                rdpos = len - (FifoBufMax - rdpos);
            }
            m_ReadPos = rdpos;
            return len;
        }
        public Int32 Fifo_Write(byte[] inbuf,Int32 maxlen)
        {
            Int32 i,wrpos, rdpos, templen;
            wrpos = m_WritePos;
            rdpos = m_ReadPos;
            if (wrpos >= rdpos) templen = FifoBufMax - wrpos + rdpos;
            else templen = rdpos - wrpos;
            if (maxlen < templen) templen = maxlen;
            if ((wrpos + templen) > FifoBufMax)
            {
                for (i = 0; i < (FifoBufMax - wrpos); i++) FifoBuf[wrpos + i] = inbuf[i];
                for (i = 0; i < (templen - (FifoBufMax - wrpos));i++) FifoBuf[i] = inbuf[i + FifoBufMax - wrpos];
                wrpos = templen - (FifoBufMax - wrpos);
            }
            else if ((wrpos + templen) == FifoBufMax)
            {
                for (i = 0; i < templen; i++) FifoBuf[i + wrpos] = inbuf[i]; 
                wrpos = 0;
            }
            else
            {
                for (i = 0; i < templen; i++) FifoBuf[i + wrpos] = inbuf[i];
                wrpos += templen;
            }
            m_WritePos = wrpos;
            return templen;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值