头文件如下:

#pragma once
#include <string>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
using namespace std; typedef int BOOL;
#define FALSE 0
#define TRUE 1 typedef unsigned char BYTE;
typedef unsigned int UINT; class MBuffer
{
public:
MBuffer();
MBuffer(const char * other);
MBuffer(const MBuffer& other);
MBuffer(const string& other);
virtual ~MBuffer();
private:
BYTE* m_pBuffer;
UINT m_nBufferSize; BYTE* m_pData;
UINT m_nDataSize; public:
virtual void FreeBuffer();
virtual BOOL AppendData(unsigned char* pData, UINT nDataSize);
virtual BOOL append( char* str,int nSize /*= 0*/ );
virtual BOOL append(const MBuffer &other);
virtual BOOL append(unsigned int value);
virtual void ClearData();
const char* GetData() ;
char* c_str() const;
unsigned long length() const;
virtual void clear();
MBuffer& operator=(const char * other);//赋值操作符重载
MBuffer& operator=(const MBuffer& other);//赋值操作符重载
MBuffer& operator=(const string& other);//赋值操作符重载
BOOL operator==(const MBuffer& other);//赋值操作符重载
char* substr( int nStart,int iSize );
int findlastofindex(char *cStr);
int findlastofindex(char cChr);
bool subbuffer(MBuffer& outBuffer,int istart,int ilen);
private:
virtual BOOL AllocateBuffer(UINT nBufferSize);
virtual BOOL ExtendBuffer(UINT nBufferSize);
virtual BOOL FillData(unsigned char* pData, UINT nDataSize); };

  CPP文件:

#include "MBuffer.h"

MBuffer::MBuffer()
{
m_pBuffer = NULL;
m_nBufferSize = 0; m_pData = NULL;
m_nDataSize = 0;
} MBuffer::MBuffer( const char * other )
{
m_pBuffer = NULL;
m_nBufferSize = 0; m_pData = NULL;
m_nDataSize = 0;
if (other != NULL)
{
AppendData((unsigned char*)other,strlen(other));
}
} MBuffer::MBuffer( const MBuffer& other )
{
m_pBuffer = NULL;
m_nBufferSize = 0; m_pData = NULL;
m_nDataSize = 0;
AppendData(other.m_pData,other.m_nDataSize);
} MBuffer::MBuffer( const string& other )
{
FreeBuffer();
AppendData((unsigned char*)other.c_str(),other.length());
} MBuffer::~MBuffer()
{
FreeBuffer();
} void MBuffer::FreeBuffer()
{
if (m_pBuffer == NULL)
return; delete[] m_pBuffer; m_pBuffer = NULL;
m_nBufferSize = 0; m_pData = NULL;
m_nDataSize = 0;
} BOOL MBuffer::AllocateBuffer( UINT nBufferSize )
{
if ( nBufferSize == 0)
return FALSE; FreeBuffer(); m_pBuffer = new BYTE[nBufferSize + 1];
if ( m_pBuffer == NULL)
return FALSE;
m_nBufferSize = nBufferSize;
memset(m_pBuffer,0,nBufferSize + 1);
m_pData = m_pBuffer; return true;
} BOOL MBuffer::ExtendBuffer( UINT nBufferSize )
{
if (nBufferSize <= m_nBufferSize)
return TRUE; return AllocateBuffer(nBufferSize);
} BOOL MBuffer::FillData( unsigned char* pData, UINT nDataSize )
{
if (pData == NULL || nDataSize == 0)
return FALSE; if (m_nBufferSize < nDataSize)
AllocateBuffer(nDataSize); memcpy(m_pBuffer, pData, nDataSize);
m_nDataSize = nDataSize; return TRUE;
} BOOL MBuffer::AppendData( unsigned char* pData, UINT nDataSize )
{
if (nDataSize == 0)
return FALSE; if (!m_pBuffer && !m_nBufferSize)
AllocateBuffer(nDataSize); if ( ( m_nBufferSize - ( m_pData - m_pBuffer)) < ( m_nDataSize + nDataSize))
{
MBuffer bufferTemp;
if (m_nDataSize)
{
if ( bufferTemp.FillData(m_pData, m_nDataSize) == FALSE)
return FALSE;
} unsigned char* pBuffer = NULL;
pBuffer = new BYTE[m_nDataSize + nDataSize + 1];
if ( pBuffer == NULL)
return FALSE; if ( m_pBuffer != NULL)
{
delete [] m_pBuffer;
m_pBuffer = NULL;
} m_pBuffer = pBuffer;
m_pData = pBuffer; m_nBufferSize = m_nDataSize + nDataSize; if (bufferTemp.m_nDataSize)
memcpy( m_pData, bufferTemp.m_pData, bufferTemp.m_nDataSize);
m_pData[m_nDataSize + nDataSize] = '\0';
m_nDataSize = bufferTemp.m_nDataSize;
}
memcpy( m_pData + m_nDataSize, pData, nDataSize);
m_nDataSize += nDataSize; return TRUE;
} void MBuffer::ClearData()
{
m_nDataSize = 0;
m_pData = m_pBuffer;
} const char* MBuffer::GetData()
{
return (char*)m_pData;
} char* MBuffer::c_str() const
{
if (m_pData == NULL || m_nDataSize<=0)
{
return NULL;
}
return (char*)m_pData;
} unsigned long MBuffer::length() const
{
return m_nDataSize;
} MBuffer& MBuffer::operator=( const char * other )
{
FreeBuffer();
if (other)
{
AppendData((unsigned char*)other,strlen(other));
}
return *this;
} MBuffer& MBuffer::operator=( const MBuffer& other )
{
FreeBuffer();
AppendData(other.m_pData,other.m_nDataSize);
return *this;
} MBuffer& MBuffer::operator=( const string& other )
{
FreeBuffer();
AppendData((unsigned char*)other.c_str(),other.length());
return *this;
} void MBuffer::clear()
{
FreeBuffer();
} char* MBuffer::substr( int nStart,int iSize )
{
if (nStart > m_nDataSize || iSize < 0 || iSize > m_nDataSize - nStart)
{
return NULL;
}
char *temp = (char*)malloc(iSize + 1);
memcpy(temp,m_pData + nStart,iSize);
temp[iSize] = '\0';
return temp;
} int MBuffer::findlastofindex( char cChr )
{
if (m_pData == NULL || m_nDataSize < 1)
{
return -1;
}
for (int i = m_nDataSize-1 ;i >=0 ; i--)
{
if (m_pData[i] == cChr)
{
return i;
}
}
return -1;
} int MBuffer::findlastofindex( char *cStr )
{
if (m_pData == NULL || cStr == NULL)
{
return -1;
} int i, s1_len = strlen(cStr), end = m_nDataSize - s1_len;
char* last_index = NULL;
for (i = end - 1; i >= 0; i--)
if (!strncmp((char*)(m_pData + i), cStr, s1_len))
return i;
return -1;
} BOOL MBuffer::append( char* str,int nSize /*= 0*/ )
{
if (nSize == 0)
{
nSize = strlen(str);
}
return AppendData((unsigned char*)str,nSize); } BOOL MBuffer::append( unsigned int value )
{
char cBuf[10]={0};
sprintf(cBuf,"%d",value);
return AppendData((unsigned char*)cBuf,strlen(cBuf)); } BOOL MBuffer::append(const MBuffer &other )
{
return AppendData((unsigned char*)other.c_str(),other.length());
} BOOL MBuffer::operator==( const MBuffer& other )
{
BOOL res = TRUE;
if (m_nDataSize != other.m_nDataSize)
{
return FALSE;
}
if (m_nDataSize<=0)
{
return FALSE;
}
for (int i =0;i<m_nDataSize;i++)
{
if (m_pData[i]!= other.m_pData[i])
{
res = FALSE;
break;
}
}
return res;
} bool MBuffer::subbuffer( MBuffer& outBuffer,int istart,int ilen )
{
if (m_nDataSize < istart + ilen || ilen <=0 || istart <0)
{
return false;
} char *sbfer = new char[ilen+1];
memset(sbfer,0,ilen+1);
memcpy(sbfer,m_pData + istart + 1,ilen -1);
outBuffer = sbfer;
delete sbfer;
return true;
}

  如果有bug还请大家帮忙指正,提出大家的宝贵意见,不断完善~谢谢~

重写String类,也有些区别,供参考的更多相关文章

  1. C++ string 类重写

    (我们知道学习C++时,在学习完C的基础内容后最先上手的就是C++的string类来学习字符串处理的内容,这里我们通过重写string类来重新认识字符串处理的内容) 1.树立string类主要函数,确 ...

  2. StringBuffer类和String类(原文地址 : http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html)

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  3. java中String与StringBuilder的区别

    相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE ...

  4. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

  5. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  6. java equals和==区别及string类的说明

    一.equals和==的区别 1.1.equals之string字符串的比较 1.1.1.源码如下图 if (this == anObject) {            return true;  ...

  7. Java中String类两种实例化的区别(转)

    原文:http://blog.csdn.net/wangdajiao/article/details/52087302 一.String类的第一种方式 1.直接赋值 例:String str = &q ...

  8. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  9. Java基础(32):String与StringBuilder、StringBuffer的区别(String类)

    在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...

随机推荐

  1. sass转换为css

    sass安装的方法参考官网:http://www.w3cplus.com/sassguide/ SASS文件转换为CSS文件的方法: 首先输出 F: 代表找到F盘 : 然后输出cd sass 代表找到 ...

  2. iOS学习之页面之间传值的方式总结

    传值三种场景: 1.属性传值(从前往后传) 需求:第二个界面标签显示第一个界面输入框文字. 第一步, 在前一个界面定义属性. (语义属性声明为copy); 第二步, 在进入下一个界面之前,给属性传入数 ...

  3. LINUX 循环fork()

    #include <sys/types.h> #include <unistd.h> int main() {            for(int i = 0; i < ...

  4. IOS NSURL基本操作-备

    NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以 ...

  5. ASIHTTPRequest中的DELETE、PUT、GET、POST请求实例-备用

    感谢分享 //  ASIFormDataRequestTests.m //  Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRe ...

  6. 新鲜出炉的awk代码

    echo "" | igawk -f main.awk # 需求:按照多种充值方式的多种金额类型进行累加统计 # 充值方式:移动卡 ,,,100元,联通卡20,,, 电信卡 ,,, ...

  7. windows下adb+flash_image刷机

    刷机是常事,总要把刷机包放在卡上,然后关机三键一起按到recovery再刷,觉得不爽,麻烦,所以研究出了adb调用flash_image刷system分区,全部脚本windows脚本执行,点点鼠标就o ...

  8. chord原理的解读

    chord: A Scalable Peer-to-peer Lookup Service for Internet Application 在 P2P 系统中,有效地定位分布在网络中不同节点的数据资 ...

  9. 通过设计让APP变快的6个方法

    我们都知道不管网页还是移动应用,响应速度都是最重要的体验指标之一,并且移动应用的网络环境不稳定,速度的体验显得尤为重要.其实速度优化不仅是程序员的事,设计,也能够让APP变得更快. 1. 后台执行 这 ...

  10. (转)PHP zval内存回收机制和refcount_gc和is_ref_gc

    出处 : http://blog.sina.com.cn/s/blog_75a2f94f0101gygh.html 对于PHP这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不 ...