#include "StdAfx.h" #include "SMS_CodeDecode.h" CSMS_CodeDecode::CSMS_CodeDecode(void) { } CSMS_CodeDecode::~CSMS_CodeDecode(void) { } DWORD CSMS_CodeDecode::gsmEncodeUcs2(const TCHAR* pWildChar,BYTE* pByte,DWORD leng) { while(*pWildChar!=0x0000) { BYTE temp=0x00; temp = (*pWildChar&0xFF00)>>8; *pByte = temp; pByte++; temp = (*pWildChar&0x00FF); *pByte = temp; pByte++; pWildChar++; } *pByte=0x00; return leng*2; } DWORD CSMS_CodeDecode::gsmDecodeUcs2(const BYTE* pByte, TCHAR* pWildChar, DWORD leng) { int i, j; for (i = 0, j = 0; i<leng; i+=2,j++) { *pWildChar++ = (pByte[i]<<8|pByte[i+1]); } *pWildChar =0x00; return j; } int CSMS_CodeDecode::gsmEncodeUcs2(const char* pSrc, unsigned char* pDest, int nSrcLength) { int nDstLength; // UNICODE宽字符数目 WCHAR wchar[128]; // UNICODE串缓冲区 // 字符串-->UNICODE串 nDstLength = MByteToWChar( pSrc, wchar, sizeof(wchar)/sizeof(wchar[0])); // 高低字节对调,输出 for(int i=0; i<nDstLength; i++) { // 先输出高位字节 *pDest++ = wchar[i] >> 8; // 后输出低位字节 *pDest++ = wchar[i] & 0xff; } // 返回目标编码串长度 return nDstLength * 2; } int CSMS_CodeDecode::gsmDecodeUcs2(const unsigned char* pSrc, char* pDest, int nSrcLength) { int nDstLength; // UNICODE宽字符数目 WCHAR wchar[128]; // UNICODE串缓冲区 // 高低字节对调,拼成UNICODE for(int i=0; i<nSrcLength/2; i++) { // 先高位字节 wchar[i] = *pSrc++ << 8; // 后低位字节 wchar[i] |= *pSrc++; } //nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDest, 160, NULL, NULL); nDstLength = WCharToMByte(wchar,pDest,sizeof(wchar)/sizeof(wchar[0])); pDest[nDstLength] = '/0'; return nDstLength; } int CSMS_CodeDecode::gsmEncode7bit(const char* pSrc, unsigned char* pDest, int nSrcLength) { int i; for(i =1; i <= nSrcLength; i++) { if(i%8 == 0) { i++; } pDest[i-i/8-1] = ((pSrc[i-1]>>(i%8-1))+ (pSrc[i]<<(8-i%8))); } return(i-1); } int CSMS_CodeDecode::gsmDecode7bit(const unsigned char* pSrc, char* pDest, int nSrcLength) { int nSrc; // 源字符串的计数值 int nDst; // 目标解码串的计数值 int nByte; // 当前正在处理的组内字节的序号,范围是0-6 unsigned char nLeft; // 上一字节残余的数据 // 计数值初始化 nSrc = 0; nDst = 0; // 组内字节序号和残余数据初始化 nByte = 0; nLeft = 0; // 将源数据每7个字节分为一组,解压缩成8个字节 // 循环该处理过程,直至源数据被处理完 // 如果分组不到7字节,也能正确处理 while(nSrc<nSrcLength) { // 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节 *pDest = ((*pSrc << nByte) | nLeft) & 0x7f; // 将该字节剩下的左边部分,作为残余数据保存起来 nLeft = *pSrc >> (7-nByte); // 修改目标串的指针和计数值 pDest++; nDst++; // 修改字节计数值 nByte++; // 到了一组的最后一个字节 if(nByte == 7) { // 额外得到一个目标解码字节 *pDest = nLeft; // 修改目标串的指针和计数值 pDest++; nDst++; // 组内字节序号和残余数据初始化 nByte = 0; nLeft = 0; } // 修改源串的指针和计数值 pSrc++; nSrc++; } *pDest = 0; // 返回目标串长度 return nDst; } int CSMS_CodeDecode::MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize) { DWORD dwMinSize; dwMinSize = MultiByteToWideChar(CP_ACP,0,lpcszStr,-1,NULL,0); if (dwSize <dwMinSize) { return 0; } //Convent ASCII to Unicode return (MultiByteToWideChar(CP_ACP,0,lpcszStr,-1,lpwszStr,dwMinSize)); } int CSMS_CodeDecode::WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize) { DWORD dwMinSize; dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE); if (dwSize <dwMinSize) { return 0; } return (WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE)); }