截取自github部分
class CSimpleBuffer
{
public:
CSimpleBuffer();
~CSimpleBuffer();
//返回buf指针
uchar_t* GetBuffer() { return m_buffer; }
//返回缓冲区大小
uint32_t GetAllocSize() { return m_alloc_size; }
//返回已写指针偏移
uint32_t GetWriteOffset() { return m_write_offset; }
//增加指针偏移
void IncWriteOffset(uint32_t len) { m_write_offset += len; }
//扩充
void Extend(uint32_t len);
//往缓冲区写入定长的数据
uint32_t Write(void* buf, uint32_t len);
//从缓冲区取出指定长度的数据到buf
uint32_t Read(void* buf, uint32_t len);
private:
//数据缓冲区指针
uchar_t* m_buffer;
//分配的空间大小
uint32_t m_alloc_size;
//已写指针偏移
uint32_t m_write_offset;
};
///////////// CSimpleBuffer ////////////////
CSimpleBuffer::CSimpleBuffer()
{
//初始化操作
m_buffer = NULL;
m_alloc_size = 0;
m_write_offset = 0;
}
CSimpleBuffer::~CSimpleBuffer()
{
m_alloc_size = 0;
m_write_offset = 0;
if (m_buffer)
{
free(m_buffer);
m_buffer = NULL;
}
}
void CSimpleBuffer::Extend(uint32_t len)
{
m_alloc_size = m_write_offset + len;
//右移1位表示原来十进制数字取一半,右移2位 则取1/4
//在此基础上再增加1/4的扩充缓冲
m_alloc_size += m_alloc_size >> 2; // increase by 1/4 allocate size
//使用realloc重新分配
/*
realloc先按照newsize指定的大小分配空间,
将原有数据从头到尾拷贝到新分配的内存区域,
而后释放原来mem_address所指内存区域(
注意:原来指针是自动释放,不需要使用free),
同时返回新分配的内存区域的首地址。
即重新分配存储器块的地址
*/
uchar_t* new_buf = (uchar_t*)realloc(m_buffer, m_alloc_size);
if(new_buf != NULL)
{
m_buffer = new_buf;
}
}
//往缓冲区写入定长的数据
uint32_t CSimpleBuffer::Write(void* buf, uint32_t len)
{
//如果当前的缓冲区大小不足以写入新的数据
if (m_write_offset + len > m_alloc_size)
{
//调用函数,进行realloc
Extend(len);
}
//如果要写入的数据存在
if (buf)
{
//内存copy
memcpy(m_buffer + m_write_offset, buf, len);
}
//已写指针偏移 +len
m_write_offset += len;
return len;//返回已写长度
}
//从缓冲区取出指定长度的数据到buf
uint32_t CSimpleBuffer::Read(void* buf, uint32_t len)
{
//如果要取的长度大于已有的,修改
if (len > m_write_offset)
len = m_write_offset;
//如果buf不为NULL
if (buf)
memcpy(buf, m_buffer, len);
//已写指针偏移 -len
m_write_offset -= len;
/*
原型:void *memmove( void* dest, const void* src, size_t count );
由src所指内存区域复制count个字节到dest所指内存区域。
*/
//就是把后面的数据往前面推
//相当于python的 data = data[m_write_offset: ]
memmove(m_buffer, m_buffer + len, m_write_offset);
return len;//返回取出的长度
}
如果是python,可以定义缓冲区data=’’;
能够直接进行data的±操作,使用字符串切片功能[],灵活方便