最近工作中一直接触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
}