c++bytebuffer留着用,要不每次要写或者找

来源:互联网 发布:pc手机微信三合一源码 编辑:程序博客网 时间:2024/05/01 17:59

头文件

#ifndef __MK_BYTE_BUFFER_H__#define __MK_BYTE_BUFFER_H__#include <iostream>const int endian = 1;#define is_bigendian() ((*(char*) &endian) == 0)#define is_littlendbian() ((*(char*) &endian) == 1)// size of data 1M#define BUFF_SIZE_MAX 1024 * 1024namespace MK{    template<typename T> T ConvertDigitToNet(T v);    template<typename T> T ConvertNetToDigit(T v);    class ByteBuffer    {    private:        char *m_cBuffer;        size_t m_rpos;                      size_t m_wpos;                      size_t m_nSize;                 public:        explicit ByteBuffer(size_t size = 0):m_rpos(0), m_wpos(0), m_nSize(size)        { size_t nSize = size <= 0 ? BUFF_SIZE_MAX:size; m_cBuffer = new char[nSize];}        ~ByteBuffer() { delete[] m_cBuffer; }        size_t readNet(int &v);        size_t readNet(short &v);        size_t read(int &v)     { return read((char*)&v, 0, sizeof(int)); }        size_t read(char &v)    { return read((char*)&v, 0, sizeof(char)); }        size_t read(short &v)   { return read((char*)&v, 0, sizeof(short)); }        size_t read(char *des, size_t desoffset, size_t len)        {            size_t tmpLen = ((m_rpos + len) > m_nSize) ? m_nSize - m_rpos : len;            ::memcpy((void*)(des + desoffset), m_cBuffer + m_rpos, tmpLen);            m_rpos += tmpLen;            return tmpLen;        }        size_t writeNet(int v);        size_t writeNet(short v);        size_t write(int v)     { return write((char*)&v, 0, sizeof(int)); }        size_t write(char v)    { return write((char*)&v, 0, sizeof(char)); }        size_t write(short v)   { return write((char*)&v, 0, sizeof(short)); }        size_t write(const char *src, size_t srcoffset, size_t len)        {            size_t tmpLen = ((m_wpos + len) > BUFF_SIZE_MAX) ? (BUFF_SIZE_MAX - m_wpos) : len;            ::memcpy(m_cBuffer + m_wpos, (void*)(src + srcoffset), tmpLen);            m_nSize = ((m_wpos + tmpLen)) > m_nSize ? m_wpos + tmpLen : m_nSize;            m_wpos += tmpLen;            return tmpLen;        }        size_t rpos() const { return m_rpos; }        size_t rpos(size_t rpos) { m_rpos = rpos; return m_rpos; }        size_t wpos() const { return m_wpos; }        size_t wpos(size_t wpos) { m_wpos = wpos; return m_wpos; }        size_t readSkip(size_t skip)         {            if (m_rpos + skip > size())                return 0;            m_rpos += skip;            return skip;        }        size_t writeSkip(size_t skip)        {            if (m_wpos + skip > size())                return 0;            m_wpos += skip;            return skip;        }        size_t Available() { return m_nSize - m_rpos; }        const char *data(size_t offset = 0) const { return m_cBuffer + offset; }        char *data(size_t offset = 0) { return m_cBuffer + offset; }        char *rdata(size_t offset = 0) { return m_cBuffer + m_rpos + offset; }        const char *rdata(size_t offset = 0) const { return m_cBuffer + m_rpos + offset; }        char *wdata(size_t offset = 0) { return m_cBuffer + m_wpos + offset; }        const char *wdata(size_t offset = 0) const { return m_cBuffer + m_wpos + offset; }        const size_t size() const { return m_nSize; }        void clear()        {            size_t tmpLen = m_nSize - m_rpos;            if (tmpLen > 0)            {                size_t i,j = 0;                for (i = m_rpos; i < m_nSize; ++i, ++j)                    m_cBuffer[j] = m_cBuffer[i];            }            m_wpos = m_wpos > m_rpos ? m_wpos - m_rpos:0;            m_nSize = tmpLen;            m_rpos = 0;        }        void reset() { m_nSize = m_rpos = m_wpos = 0; }    };}#endif // __MK_BYTE_BUFFER_H__

cpp

#include "ByteBuffer.h"namespace ByteConverter{    template<size_t T>    inline void convert(char* val)    {        std::swap(*val, *(val + T - 1));        convert < T - 2 > (val + 1);    }    template<> inline void convert<0>(char*) {}    template<> inline void convert<1>(char*) {}    template<typename T>    inline void apply(T* val)    {        convert<sizeof(T)>((char*)(val));    }}namespace MK{    //---------------------------------------------    //     template<typename T>    T EndianConvert(char *data)    {        T v;        ::memcpy(&v, data, sizeof(T));        if (is_littlendbian())            ByteConverter::apply<T>(&v);        return v;    }    //---------------------------------------------    //    template<typename T>    T EndianConvertReverse(char *data)    {        T v;        ::memcpy(&v, data, sizeof(T));        if (is_littlendbian())            ByteConverter::apply<T>(&v);        return v;    }    //----------------------------------------------    // big or small change    template<typename T> T ConvertDigitToNet(T v)    {        return EndianConvert<T>((char*)&v);    }    //---------------------------------------------    // big or small change    template<typename T> T ConvertNetToDigit(T v)    {        return EndianConvertReverse<T>((char*)&v);    }    size_t ByteBuffer::readNet(int &v)  { size_t t = read(v); v = ConvertNetToDigit(v); return t; }    size_t ByteBuffer::readNet(short &v) { size_t t = read(v); v = ConvertNetToDigit(v); return t; }    size_t ByteBuffer::writeNet(int v)  { v = ConvertDigitToNet(v); return write(v); }    size_t ByteBuffer::writeNet(short v)  { v = ConvertDigitToNet(v); return write(v); }};
0 0