字符串处理

最近工作中一直接触GDI+,总是需要为了转换字符串花费不少功夫,写了一个简易的字符串辅助类去对字符串进行转化处理.

 


//字符串辅助类
//在各种字符串之间转换(追求的是高效率的内存利用率)
//在速度方面欠佳(可以牺牲部分内存去提高速度)
class CStringHelper
{
 void *m_pData;             //内存地址
 int   m_iMaxMemSize;     //内存大小(以便省内存 单位是byte)

public:
 CStringHelper(void);

 CStringHelper( char *str);
 CStringHelper( WCHAR *str);

 char * wcharToChar(const WCHAR *str);
 WCHAR * charToWchar(const char *str);

  WCHAR *tcharToWchar( TCHAR *str);
  char *tcharToChar( TCHAR *);
  TCHAR *charToTchar( char *str);
  TCHAR *wcharToTchar( WCHAR *str);


  //操作符号重载
  operator char *() {return (char *)m_pData;}

  operator WCHAR *() {return (WCHAR *)m_pData;}

 ~CStringHelper(void);
};

 

 

#include "StdAfx.h"
#include "StringHelper.h"

CStringHelper::CStringHelper(char *str)
{
 m_pData = NULL;
 m_iMaxMemSize = -1;
 charToWchar(str);
}
CStringHelper::CStringHelper(WCHAR *strW)
{
 m_iMaxMemSize = -1;
 m_pData = NULL;
 wcharToChar(strW);
}

CStringHelper::CStringHelper(void)
{
 m_iMaxMemSize = -1;
 m_pData = NULL;
}

CStringHelper::~CStringHelper(void)
{
 if(m_pData)
 {
  delete []m_pData;
  m_pData = NULL;
 }
}

char * CStringHelper::wcharToChar(const WCHAR *strW)
{
 int size=0;
 //size是转化为多字节符后,其字符串所占有的内存大小(单位是sizeof(char))
 size =WideCharToMultiByte ( CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL );
 //利用内存
 char * str=NULL;
 if(m_iMaxMemSize >=size&&strW != m_pData)
 {
  str =(char *)m_pData;
  WideCharToMultiByte ( CP_ACP, 0, strW, -1, str, size, NULL, NULL );
  return str;
 }
 //内存不够再分配(可以直接分配(wcslen(strW)+1)*2)大小的char)
 str=new char[size];
 m_iMaxMemSize = size;
 //自动把0复制到最后
 WideCharToMultiByte ( CP_ACP, 0, strW, -1, str, size, NULL, NULL );
 //保存数据
 if(m_pData)
 {
  delete []m_pData;
  m_pData = NULL;
 }
 m_pData = str;
 return str; 
}
WCHAR * CStringHelper::charToWchar(const char *str)
{
 
 int  strSize = strlen(str);
 //wSize是转化为宽字符后,其字符串所占有的内存大小-1(单位是sizeof(WCHAR))
 //与wchar->char有点不同
 int wSize=MultiByteToWideChar(CP_ACP, 0, str, strSize, NULL, 0);
 wSize +=1;
 WCHAR *strW = NULL;
 if(m_iMaxMemSize >=2*wSize)
 {
  strW = (WCHAR *) m_pData;
  MultiByteToWideChar(CP_ACP, 0, str, strSize, strW, wSize);
  strW[wSize-1]=0;
  return strW;
 }
 //内存不够再分配(可以直接分配(strlen(str)+1)大小的WCHAR)
 strW=new WCHAR[wSize]; 
 m_iMaxMemSize = 2*(wSize);

 MultiByteToWideChar(CP_ACP, 0, str, strSize, strW, wSize);
 //最后一位 置0
 strW[wSize-1]=0;
 //保存之前先释放内存防止内存泄露
 if(m_pData)
 {
  delete []m_pData;
  m_pData = NULL;
 }
 //保存数据
 m_pData= strW;
 return strW;
}

WCHAR *  CStringHelper::tcharToWchar( TCHAR *str)
{
#ifdef  UINCODE
 return str;
#else
 return charToWchar(str);
#endif
}

char * CStringHelper::tcharToChar( TCHAR *str)
{
#ifdef  UINCODE
 return wcharToChar(str);
#else
 return str;
#endif
}

TCHAR *CStringHelper::charToTchar( char *str)
{
#ifdef  UINCODE
 return charToWchar(str);
#else
 return str;
#endif
}
TCHAR *CStringHelper::wcharToTchar(WCHAR *str)
{
#ifdef  UINCODE
 return str;
#else
 return wcharToChar(str);
#endif
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值