• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評論-111  文章-0  trackbacks-0
            //////////////////////////////////////
            // CStreamPacket by 太子 2005-12-13 //
            //////////////////////////////////////
            #pragma once
            const c_BufferBlockSize=0x10000;
            class CStreamPacket
            {
            private:
                unsigned 
            char*m_pBuffer;
                size_t m_BufferLength;
                size_t m_DataStart;
                size_t m_DataSize;
            public:
                CStreamPacket() : m_BufferLength(
            0), m_DataStart(0), m_DataSize(0)
                
            {
                    m_pBuffer
            =new unsigned char[c_BufferBlockSize];
                    m_BufferLength
            =c_BufferBlockSize;
                }

                
            ~CStreamPacket(){ delete[]m_pBuffer; }
            private:
                
            bool ResizeBuffer()
                
            {
                    size_t size
            =m_BufferLength<<1;
                    unsigned 
            char*tmp=new unsigned char[size];
                    unsigned 
            char*tmp2;
                    memcpy(tmp,m_pBuffer
            +m_DataStart,m_DataSize);
                    tmp2
            =m_pBuffer;
                    m_pBuffer
            =tmp;
                    delete[]tmp2;
                    m_DataStart
            =0;
                    m_BufferLength
            =size;
                    
            return true;
                }

                
            bool RecomposeBuffer()
                
            {
                    
            if(m_DataStart>0)
                    
            {
                        memcpy(m_pBuffer,m_pBuffer
            +m_DataStart,m_DataSize);
                        m_DataStart
            =0;
                        
            return true;
                    }

                    
            return false;
                }

            public:
                
            // 從緩沖中取一個(gè)變量
                
            // 可以是基本數(shù)據(jù)類型 也可以是struct
                
            // 但不能為數(shù)組 否則不能正常取值
                template <class T> CStreamPacket& operator>>( T& Data )
                
            {
                    size_t Size
            =sizeof(T);
                    Data
            =*((T*)(m_pBuffer+m_DataStart));
                    m_DataStart
            +=Size;
                    m_DataSize
            -=Size;
                    
            return *this;
                }

                
            // 從緩沖中取一個(gè)0結(jié)尾數(shù)組
                
            // 如C字符串
                template <class T> CStreamPacket& operator>>( T Data[] )
                
            {
                    size_t Size
            =sizeof(T);
                    size_t i
            =0;
                    
            while(true)
                    
            {
                        
            operator >>(Data[i]);
                        
            if(Data[i]==(T)0)break;
                        i
            ++;
                    }

                    
            return *this;
                }

                
            // 向緩沖中存一個(gè)變量
                template <class T> CStreamPacket& operator<<const T& Data )
                
            {
                    size_t Size
            =sizeof(T);
                    
            while(m_DataSize+m_DataStart+Size>m_BufferLength)//不能直接內(nèi)存copy
                    {
                        
            if(m_DataSize+Size>m_BufferLength)//緩沖大小不夠
                        {
                            ResizeBuffer();
            //擴(kuò)大
                        }

                        
            else
                        
            {
                            RecomposeBuffer();
            //重組
                        }

                    }

                    
            *((T*)(m_pBuffer+m_DataStart+m_DataSize))=Data;
                    m_DataSize
            +=Size;
                    
            return *this;
                }

                
            // 向緩沖中存一個(gè)0結(jié)尾的數(shù)組
                
            // 如C字符串
                template <class T> CStreamPacket& operator<<( T Data[] )
                
            {
                    size_t i
            =0;
                    
            while(true)
                    
            {
                        
            operator <<(Data[i]);
                        
            if(Data[i]==(T)0)break;
                        i
            ++;
                    }

                    
            return *this;
                }

                
            //來自另外一個(gè)CStreamPacket
                CStreamPacket& operator<<const CStreamPacket& Packet )
                
            {
                    size_t Size
            =Packet.m_DataSize;
                    
            while(m_DataSize+m_DataStart+Size>m_BufferLength)//不能直接內(nèi)存copy
                    {
                        
            if(m_DataSize+Size>m_BufferLength)//緩沖大小不夠
                        {
                            ResizeBuffer();
            //擴(kuò)大
                        }

                        
            else
                        
            {
                            RecomposeBuffer();
            //重組
                        }

                    }

                    memcpy(m_pBuffer
            +m_DataStart+m_DataSize,Packet.m_pBuffer+Packet.m_DataStart,Packet.m_DataSize);
                    m_DataSize
            +=Size;
                    
            return *this;
                }

                size_t GetSize()
                
            {
                    
            return m_DataSize;
                }


                
            void* GetBuffer()
                
            {
                    
            return m_pBuffer+m_DataStart;
                }

            }
            ;
            // BUFFER.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。
            //

            #include 
            "stdafx.h"
            #include 
            ".\buffer.h"
            #include 
            <windows.h>

            using namespace std;
            struct testStruct
            {
                
            char name[10];
                
            long age;
                
            float ff;
                
            bool sex;
            }
            ;
            int _tmain(int argc, _TCHAR* argv[])
            {
                
            //CBuffer buf1;
                
            //buf1<<"Hello World!"<<L"我是中國人!!";
                
            //buf1<<"1234567890";
                
            //buf1<<(unsigned char)0x12;
                
            //buf1<<(unsigned short)0x5634;
                
            //buf1<<(unsigned long)0x34129078;
                
            //testStruct ss;
                
            //strcpy(ss.name,"ss.name");
                
            //ss.age=0x86AE;
                
            //ss.ff=3.;
                
            //ss.sex=true;
                
            //buf1<<ss;
                
            //CBuffer buf2;
                
            //long double ll,jj=3.141592653589793;
                
            //long xx,yy=123456789;
                
            //buf2<<jj;
                
            //buf2<<yy;
                
            //buf2>>ll;
                
            //buf2>>xx;
                CStreamPacket buf3;
            #define MB_COUNT (0x100000)
            #define MB_SIZE (0x400)
                
            char*pp=new char[MB_SIZE];
                
            char*pp2=new char[MB_SIZE];
                memset(pp,
            '#',MB_SIZE);
                pp[MB_SIZE
            -1]=(char)0;
                DWORD t1,t2;
                cout
            <<"塊大小"<<MB_SIZE<<",測試次數(shù)"<<MB_COUNT<<endl;;
                cout
            <<"開始...";
                t1
            =GetTickCount();
                
            for(int ii=0;ii<MB_COUNT;ii++)
                
            {
                    buf3
            <<pp;
                    
            //cout<<"buf3.GetSize()="<<buf3.GetSize()<<endl;
                    buf3>>pp2;
                    
            //cout<<"buf3.GetSize()="<<buf3.GetSize()<<endl;
                }

                t2
            =GetTickCount()-t1;
                cout
            <<"完成!"<<endl;
                buf3
            <<pp;
                cout
            <<(char*)buf3.GetBuffer()<<endl;
                delete[]pp;
                delete[]pp2;
                
            //cout<<t2<<endl;
                
            //cout<<(MB_SIZE*MB_COUNT)/(t2)<<" byte/ms"<<endl;
                cout<<"處理"<<MB_SIZE*MB_COUNT<<"字節(jié),耗時(shí)"<<t2<<"毫秒!速度"<<(MB_SIZE*MB_COUNT)/(t2)<<"字節(jié)每毫秒"<<endl;
                system(
            "pause");
                
            return 0;
            }

            posted on 2007-04-23 23:44 shaker(太子) 閱讀(1903) 評論(3)  編輯 收藏 引用 所屬分類: C++

            評論:
            # re: 以前寫的一個(gè)網(wǎng)絡(luò)流封包類 2007-04-24 01:07 | 飯中淹
            稍微...有個(gè)BUG...

            析出的時(shí)候沒有判斷是否超出邊界...
              回復(fù)  更多評論
              
            # re: 以前寫的一個(gè)網(wǎng)絡(luò)流封包類 2007-05-26 23:08 | To Be C++
            @飯中淹

            e..... 發(fā)現(xiàn)了

              回復(fù)  更多評論
              
            # re: 以前寫的一個(gè)網(wǎng)絡(luò)流封包類 2007-07-11 13:03 | 幸福的耗子
            1樓還真細(xì)心~
            -_-////  回復(fù)  更多評論
              
            精品久久久久中文字| 午夜欧美精品久久久久久久| 亚洲伊人久久精品影院| 日批日出水久久亚洲精品tv| 久久国产精品无码HDAV| 亚洲国产精品一区二区久久hs| 久久久网中文字幕| 久久久精品人妻无码专区不卡| 国产精品gz久久久| 亚洲一本综合久久| 国产99久久久久久免费看| 亚洲精品国产成人99久久| 91精品久久久久久无码| 日本一区精品久久久久影院| 2020最新久久久视精品爱| 嫩草影院久久99| 99久久精品免费看国产一区二区三区 | 亚洲香蕉网久久综合影视| 99久久做夜夜爱天天做精品| 久久人人爽人人爽人人爽| 99蜜桃臀久久久欧美精品网站| 欧美熟妇另类久久久久久不卡 | AV色综合久久天堂AV色综合在| 久久ZYZ资源站无码中文动漫| 久久成人影院精品777| 91精品国产91久久久久久| 久久综合精品国产一区二区三区| 欧美伊人久久大香线蕉综合69| 色青青草原桃花久久综合| 久久久久亚洲av无码专区| 91精品国产综合久久婷婷 | 精品久久久久久国产三级| 欧美日韩精品久久久久| 亚洲va久久久噜噜噜久久狠狠 | 国产巨作麻豆欧美亚洲综合久久 | 亚洲欧洲久久久精品| 色偷偷偷久久伊人大杳蕉| 久久99精品久久久久久秒播| 亚洲精品午夜国产va久久| AV色综合久久天堂AV色综合在| 久久精品国产第一区二区|