buffer缓冲区类

截取自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的±操作,使用字符串切片功能[],灵活方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值