美文网首页
记录一下封装的ByteBuffer

记录一下封装的ByteBuffer

作者: Buckler | 来源:发表于2017-06-15 14:01 被阅读46次

    MyByteBuffer.h

    #include "cocos2d.h"
    #include <string>
    //////////////////////////////////////////////////////////////////////////
    ///  bytebuffer 
    //////////////////////////////////////////////////////////////////////////
    class MyByteBuffer
    {
    public:
        MyByteBuffer();
        ~MyByteBuffer();
        MyByteBuffer(const unsigned char* data, int dataLen);
    public:
        // 获得缓冲区数据长度
        int getBufferDataLength();
        // 获得游标位置
        int getCursorPosition();
        void PushByte(char by);
        void PushByteArray(const unsigned char* data, int dataLen);
        void PushInt(int num);
        void PushLong(long Num);
        void PushString(const std::string& str);
        void PushPoint(cocos2d::Vec2& point);
        void PushFloat(float value);
        char PopByte();
        int PopInt();
        long PopLong();
        float PopFloat();
        const unsigned char* PopByteArray(int Length);
        std::string PopString();
        cocos2d::Vec2 PopPoint();
        unsigned char* ToByteArray();
    private:
        /// 获取新的缓冲区
        unsigned char* initNewBuffer(int buffLen);
        /// 检测缓冲区是否足够
        void checkBuffSize(int addDataLen);
    private:
        //固定长度的中间数组
        unsigned char* temp_byte_array;
        //当前数据长度
        int current_data_length;
        //当前游标位置
        int cursor_position;
        // 缓冲区大小
        int bufferSize;
    };
    

    MyByteBuffer.cpp

    #include "MyByteBuffer.h"
    #include <memory>
    
    const int BUFFER_BLOCK = 1024; // 缓冲块
    
    MyByteBuffer::MyByteBuffer()
    {
        this->temp_byte_array = initNewBuffer(BUFFER_BLOCK);
        this->current_data_length = 0;
        this->cursor_position = 0;
        this->bufferSize = BUFFER_BLOCK;
    }
    
    MyByteBuffer::MyByteBuffer(const unsigned char* data, int dataLen)
    {
        this->temp_byte_array = initNewBuffer(BUFFER_BLOCK);
        this->current_data_length = 0;
        this->cursor_position = 0;
        this->bufferSize = BUFFER_BLOCK;
    
        PushByteArray(data, dataLen);
    }
    
    MyByteBuffer::~MyByteBuffer()
    {
        delete[] this->temp_byte_array;
    }
    
    unsigned char* MyByteBuffer::initNewBuffer(int buffLen)
    {
        unsigned char* buff = new unsigned char[buffLen];
        memset(buff, 0x00, buffLen);
        return buff;
    }
    
    void MyByteBuffer::checkBuffSize(int addDataLen)
    {
        int needLen = current_data_length + addDataLen;
        int newBuffSize = this->bufferSize;
        if (needLen < newBuffSize)
        {
            // 数据存储区域足够
            return;
        }
        // 存储区不足,重新分配
        while (newBuffSize <= needLen)
        {
            newBuffSize += BUFFER_BLOCK;
        }
        unsigned char* tmparr = initNewBuffer(newBuffSize);
        this->bufferSize = newBuffSize;
        // 拷贝资源
        memcpy(tmparr, this->temp_byte_array, current_data_length);
        // 释放旧内存
        delete[] this->temp_byte_array;
        this->temp_byte_array = tmparr;
    }
    
    int MyByteBuffer::getBufferDataLength()
    {
        return current_data_length;
    }
    
    int MyByteBuffer::getCursorPosition()
    {
        return cursor_position;
    }
    
    void MyByteBuffer::PushByte(char by)
    {
        checkBuffSize(1);
        temp_byte_array[current_data_length++] = by;
    }
    
    void MyByteBuffer::PushByteArray(const unsigned char* data, int dataLen)
    {
        checkBuffSize(dataLen);
        //把自己CopyTo目标数组
        memcpy(temp_byte_array + current_data_length, data, dataLen);
        //调整长度
        current_data_length += dataLen;
    }
    
    void MyByteBuffer::PushInt(int Num)
    {
        checkBuffSize(4);
        temp_byte_array[current_data_length++] = (char)(((Num & 0xff000000) >> 24) & 0xff);
        temp_byte_array[current_data_length++] = (char)(((Num & 0x00ff0000) >> 16) & 0xff);
        temp_byte_array[current_data_length++] = (char)(((Num & 0x0000ff00) >> 8) & 0xff);
        temp_byte_array[current_data_length++] = (char)((Num & 0x000000ff) & 0xff);
    }
    
    void MyByteBuffer::PushLong(long Num)
    {
        checkBuffSize(4);
        temp_byte_array[current_data_length++] = (char)(((Num & 0xff000000) >> 24) & 0xff);
        temp_byte_array[current_data_length++] = (char)(((Num & 0x00ff0000) >> 16) & 0xff);
        temp_byte_array[current_data_length++] = (char)(((Num & 0x0000ff00) >> 8) & 0xff);
        temp_byte_array[current_data_length++] = (char)((Num & 0x000000ff) & 0xff);
    }
    
    /// <summary>
    /// 从ByteBuffer的当前位置弹出一个Byte,并提升一位
    /// </summary>
    /// <returns>1字节Byte</returns>
    char MyByteBuffer::PopByte()
    {
        char ret = temp_byte_array[cursor_position++];
        return ret;
    }
    
    /// <summary>
    /// 从ByteBuffer的当前位置弹出一个uint,并提升4位
    /// </summary>
    /// <returns>4字节UInt</returns>
    int MyByteBuffer::PopInt()
    {
        if (cursor_position + 3 >= current_data_length)
            return 0;
        int ret = (int)(temp_byte_array[cursor_position] << 24 | temp_byte_array[cursor_position + 1] << 16 | temp_byte_array[cursor_position + 2] << 8 | temp_byte_array[cursor_position + 3]);
        cursor_position += 4;
        return ret;
    }
    
    /// <summary>
    /// 从ByteBuffer的当前位置弹出一个long,并提升4位
    /// </summary>
    /// <returns>4字节Long</returns>
    long MyByteBuffer::PopLong()
    {
        if (cursor_position + 3 >= current_data_length)
            return 0;
        long ret = (long)(temp_byte_array[cursor_position] << 24 | temp_byte_array[cursor_position + 1] << 16 | temp_byte_array[cursor_position + 2] << 8 | temp_byte_array[cursor_position + 3]);
        cursor_position += 4;
        return ret;
    }
    
    /// <summary>
    /// 从ByteBuffer的当前位置弹出长度为Length的Byte数组,提升Length位
    /// </summary>
    /// <param name="Length">数组长度</param>
    /// <returns>Length长度的byte数组</returns>
    const unsigned char* MyByteBuffer::PopByteArray(int Length)
    {
        //溢出
        if (cursor_position + Length > current_data_length)
        {
            return nullptr;
        }
        unsigned char* ret = temp_byte_array + cursor_position;
        cursor_position += Length;
        return ret;
    }
    
    
    /// <summary>
    /// 放入字符串
    /// </summary>
    /// <param name="str"></param>
    void MyByteBuffer::PushString(const std::string& str)
    {
        PushInt(str.length());
        PushByteArray((const unsigned char*)str.c_str(), str.length());
    }
    
    /// <summary>
    /// 取出字符串
    /// </summary>
    /// <returns></returns>
    std::string MyByteBuffer::PopString()
    {
        int strlen = PopInt();
        if (strlen <= 0)
        {
            return "";
        }
        const char* bytes = (const char*)PopByteArray(strlen);
        std::string ret = std::string(bytes, 0, strlen);
        return ret;
    }
    
    void MyByteBuffer::PushPoint(cocos2d::Vec2& point)
    {
        PushInt(point.x);
        PushInt(point.y);
    }
    
    cocos2d::Vec2 MyByteBuffer::PopPoint()
    {
        int x = PopInt();
        int y = PopInt();
        return cocos2d::Vec2(x, y);
    }
    
    union FloatBinUnion
    {
        float floatvalue;
        unsigned char bitvalue[4];
        int intvalue;
    };
    
    
    void MyByteBuffer::PushFloat(float value)
    {
        FloatBinUnion bin;
        bin.floatvalue = value;
        PushInt(bin.intvalue);
    }
    
    float MyByteBuffer::PopFloat()
    {
        FloatBinUnion bin;
        bin.intvalue = PopInt();
        return bin.floatvalue;
    }
    
    unsigned char* MyByteBuffer::ToByteArray()
    {
        //分配大小
        unsigned char* RETURN_ARRAY = new unsigned char[current_data_length];
        //调整指针
        memcpy(RETURN_ARRAY, temp_byte_array, current_data_length);
        return RETURN_ARRAY;
    }
    

    相关文章

      网友评论

          本文标题:记录一下封装的ByteBuffer

          本文链接:https://www.haomeiwen.com/subject/ivoyqxtx.html