• <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:
                
            // 從緩沖中取一個變量
                
            // 可以是基本數據類型 也可以是struct
                
            // 但不能為數組 否則不能正常取值
                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;
                }

                
            // 從緩沖中取一個0結尾數組
                
            // 如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;
                }

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

                        
            else
                        
            {
                            RecomposeBuffer();
            //重組
                        }

                    }

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

                
            // 向緩沖中存一個0結尾的數組
                
            // 如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;
                }

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

                        
            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 : 定義控制臺應用程序的入口點。
            //

            #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<<",測試次數"<<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<<"字節,耗時"<<t2<<"毫秒!速度"<<(MB_SIZE*MB_COUNT)/(t2)<<"字節每毫秒"<<endl;
                system(
            "pause");
                
            return 0;
            }

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

            評論:
            # re: 以前寫的一個網絡流封包類 2007-04-24 01:07 | 飯中淹
            稍微...有個BUG...

            析出的時候沒有判斷是否超出邊界...
              回復  更多評論
              
            # re: 以前寫的一個網絡流封包類 2007-05-26 23:08 | To Be C++
            @飯中淹

            e..... 發現了

              回復  更多評論
              
            # re: 以前寫的一個網絡流封包類 2007-07-11 13:03 | 幸福的耗子
            1樓還真細心~
            -_-////  回復  更多評論
              
            久久精品成人一区二区三区| 国产精品久久久久蜜芽| 精品国产乱码久久久久久郑州公司 | 久久免费视频一区| 国产精品岛国久久久久| 久久国产色AV免费观看| WWW婷婷AV久久久影片| 久久99国产精品二区不卡| 狠狠色伊人久久精品综合网| 久久精品亚洲福利| 亚洲中文字幕久久精品无码APP| 亚洲第一极品精品无码久久 | 老司机午夜网站国内精品久久久久久久久 | av无码久久久久不卡免费网站| 久久国产亚洲精品麻豆| 久久精品综合网| 久久精品一区二区三区中文字幕 | 久久国语露脸国产精品电影| 国产一区二区三区久久| 久久精品国产久精国产果冻传媒| 久久99精品久久久久久久不卡 | 久久人爽人人爽人人片AV| 久久99精品国产麻豆蜜芽| 97精品久久天干天天天按摩 | 91久久婷婷国产综合精品青草 | 久久精品国产精品亚洲精品| 蜜臀久久99精品久久久久久| 久久久久久久99精品免费观看| 精品综合久久久久久97| 7777久久久国产精品消防器材| 久久99国产一区二区三区| 久久精品午夜一区二区福利 | 国产美女久久精品香蕉69| 亚洲AV日韩精品久久久久久| 亚洲精品乱码久久久久久蜜桃| 一级做a爰片久久毛片毛片| 日日狠狠久久偷偷色综合免费 | www.久久热.com| 国产99久久久久久免费看| 亚洲精品成人久久久| 久久香综合精品久久伊人|