求MFC/C++ GSM 7位解码 算法方法 我现在使用CMPP协议发送短信,现在对回来的 CMPP_DELIVER中的Msg_Content要解码.CMPP_DELIVER中的Msg_Fmt = 0:ASCII串.希望有的朋友能提一下,急.谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 既然是ASCII,根据协议中,按照长度协议字段中把数据包,相应的位置,相应的字节数取出来,然后添加结尾\0,就可以当作字符串了不知道你问的到底是什么,CMPP协议里规定了如下编码信息格式 0:ASCII串 3:短信写卡操作 4:二进制信息 8:UCS2编码15:含GB汉字通常如果是文字短信,用0和15比较多,8也比较常用。 现在是8:UCS2编码 但是找不到解编的方法. 用iconv都不行啊 //ucs2编码的数据,至于内容嘛,就自己看了 unsigned char szUCS[]= {0x77,0xED,0x4F,0xE1,0x00,0x63,0x00,0x64,0x53,0x05,0x67,0x08,0x8B,0xDD,0x53,0x55}; TCHAR result[100]; WCHAR *wszUcs =new WCHAR[sizeof(szUCS)+1]; memset(result,0,sizeof(result)); memset(wszUcs,0,(sizeof(szUCS)+1)*sizeof(WCHAR)); int nUcs=sizeof(szUCS); //第一步:from ucs2->unicode ,把ucs2的缓冲区里每两个字节,相互倒位置就成了unicode的缓冲存储了 for (int j=0;j < nUcs;j+=2) { wszUcs[j/2]=(((unsigned short )szUCS[j])<<8)|((unsigned short )szUCS[j+1]); } //第二步:from unicode->gb2312,很简单了,直接转换成普通的字符串就可以了 WideCharToMultiByte( CP_ACP, 0, wszUcs, -1, result, sizeof(result), NULL, NULL ); TRACE ("unicode-->GB2312:%s\n",result); delete[] wszUcs; int USC2toGB2312(char *src, int size, int len) { WCHAR *buf = new WCHAR[len]; int nRet = len * 2; for(int i = 0; i < len; i++) { char cTemp = src[i]; src[i] = src[i+1]; src[i+1] = cTemp; i++; } if(nRet > size) nRet = size; memset(buf, 0, len * 2); memcpy(buf, src, size); memset(src, 0, size); nRet = WideCharToMultiByte(0, 0, buf, len, src, size, NULL, NULL); delete [] buf; return nRet; } // 7bit编码// 输入: pSrc - 源字符串指针// nSrcLength - 源字符串长度// 输出: pDst - 目标编码串指针// 返回: 目标编码串长度int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength){ int nSrc; // 源字符串的计数值 int nDst; // 目标编码串的计数值 int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7 unsigned char nLeft; // 上一字节残余的数据 // 计数值初始化 nSrc = 0; nDst = 0; // 将源串每8个字节分为一组,压缩成7个字节 // 循环该处理过程,直至源串被处理完 // 如果分组不到8字节,也能正确处理 while (nSrc < nSrcLength) { // 取源字符串的计数值的最低3位 nChar = nSrc & 7; // 处理源串的每个字节 if(nChar == 0) { // 组内第一个字节,只是保存起来,待处理下一个字节时使用 nLeft = *pSrc; } else { // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节 *pDst = (*pSrc << (8-nChar)) | nLeft; // 将该字节剩下的左边部分,作为残余数据保存起来 nLeft = *pSrc >> nChar; // 修改目标串的指针和计数值 pDst++; nDst++; } // 修改源串的指针和计数值 pSrc++; nSrc++; } // 返回目标串长度 return nDst;}// 7bit解码// 输入: pSrc - 源编码串指针// nSrcLength - 源编码串长度// 输出: pDst - 目标字符串指针// 返回: 目标字符串长度int gsmDecode7bit(const unsigned char* pSrc, char* pDst, 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) { // 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节 *pDst = ((*pSrc << nByte) | nLeft) & 0x7f; // 将该字节剩下的左边部分,作为残余数据保存起来 nLeft = *pSrc >> (7-nByte); // 修改目标串的指针和计数值 pDst++; nDst++; // 修改字节计数值 nByte++; // 到了一组的最后一个字节 if(nByte == 7) { // 额外得到一个目标解码字节 *pDst = nLeft; // 修改目标串的指针和计数值 pDst++; nDst++; // 组内字节序号和残余数据初始化 nByte = 0; nLeft = 0; } // 修改源串的指针和计数值 pSrc++; nSrc++; } // 输出字符串加个结束符 *pDst = '\0'; // 返回目标串长度 return nDst;} // 8bit编码// 输入: pSrc - 源字符串指针// nSrcLength - 源字符串长度// 输出: pDst - 目标编码串指针// 返回: 目标编码串长度int gsmEncode8bit(const char* pSrc, unsigned char* pDst, int nSrcLength){ // 简单复制 memcpy(pDst, pSrc, nSrcLength); return nSrcLength;}// 8bit解码// 输入: pSrc - 源编码串指针// nSrcLength - 源编码串长度// 输出: pDst - 目标字符串指针// 返回: 目标字符串长度int gsmDecode8bit(const unsigned char* pSrc, char* pDst, int nSrcLength){ // 简单复制 memcpy(pDst, pSrc, nSrcLength); // 输出字符串加个结束符 *pDst = '\0'; return nSrcLength;}// UCS2编码// 输入: pSrc - 源字符串指针// nSrcLength - 源字符串长度// 输出: pDst - 目标编码串指针// 返回: 目标编码串长度int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength){ int nDstLength; // UNICODE宽字符数目 WCHAR wchar[128]; // UNICODE串缓冲区 // 字符串-->UNICODE串 nDstLength = MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128); // 高低字节对调,输出 for(int i=0; i<nDstLength; i++) { *pDst++ = wchar[i] >> 8; // 先输出高位字节 *pDst++ = wchar[i] & 0xff; // 后输出低位字节 } // 返回目标编码串长度 return nDstLength * 2;}// UCS2解码// 输入: pSrc - 源编码串指针// nSrcLength - 源编码串长度// 输出: pDst - 目标字符串指针// 返回: 目标字符串长度int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, 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++; // 后低位字节 } // UNICODE串-->字符串 nDstLength = WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL); // 输出字符串加个结束符 pDst[nDstLength] = '\0'; // 返回目标字符串长度 return nDstLength;} zlib 无法解析的外部命令? 音频比较的问题,VC6.0 如何改变Check Box小勾的图标,进来帮帮我吧 VC 如何画虚线矩形框 如何手动添加basetsd.h进工程? VC/MFC入门,烦请高手解惑!! ★★★ 请问在上海兼职或干私活的机会多不多?★★★ ???这是怎麽回事,好奇怪??? 出现这句话时可能是那里出问题了? ComboBox的怪问题?????????????? ~~~~~~~~~~~根据一个BMP图片文件,怎么样生成一个HBITMAP对象?????? VC技术交流探讨群
信息格式
0:ASCII串
3:短信写卡操作
4:二进制信息
8:UCS2编码
15:含GB汉字通常如果是文字短信,用0和15比较多,8也比较常用。
unsigned char szUCS[]= {0x77,0xED,0x4F,0xE1,0x00,0x63,0x00,0x64,0x53,0x05,0x67,0x08,0x8B,0xDD,0x53,0x55}; TCHAR result[100];
WCHAR *wszUcs =new WCHAR[sizeof(szUCS)+1]; memset(result,0,sizeof(result));
memset(wszUcs,0,(sizeof(szUCS)+1)*sizeof(WCHAR));
int nUcs=sizeof(szUCS); //第一步:from ucs2->unicode ,把ucs2的缓冲区里每两个字节,相互倒位置就成了unicode的缓冲存储了
for (int j=0;j < nUcs;j+=2)
{
wszUcs[j/2]=(((unsigned short )szUCS[j])<<8)|((unsigned short )szUCS[j+1]);
} //第二步:from unicode->gb2312,很简单了,直接转换成普通的字符串就可以了
WideCharToMultiByte( CP_ACP, 0, wszUcs, -1,
result, sizeof(result), NULL, NULL );
TRACE ("unicode-->GB2312:%s\n",result);
delete[] wszUcs;
{
WCHAR *buf = new WCHAR[len];
int nRet = len * 2;
for(int i = 0; i < len; i++)
{
char cTemp = src[i];
src[i] = src[i+1];
src[i+1] = cTemp;
i++;
}
if(nRet > size)
nRet = size;
memset(buf, 0, len * 2);
memcpy(buf, src, size);
memset(src, 0, size);
nRet = WideCharToMultiByte(0, 0, buf, len, src, size, NULL, NULL);
delete [] buf; return nRet;
}
// 输入: pSrc - 源字符串指针
// nSrcLength - 源字符串长度
// 输出: pDst - 目标编码串指针
// 返回: 目标编码串长度
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nSrc; // 源字符串的计数值
int nDst; // 目标编码串的计数值
int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7
unsigned char nLeft; // 上一字节残余的数据 // 计数值初始化
nSrc = 0;
nDst = 0; // 将源串每8个字节分为一组,压缩成7个字节
// 循环该处理过程,直至源串被处理完
// 如果分组不到8字节,也能正确处理
while (nSrc < nSrcLength)
{
// 取源字符串的计数值的最低3位
nChar = nSrc & 7; // 处理源串的每个字节
if(nChar == 0)
{
// 组内第一个字节,只是保存起来,待处理下一个字节时使用
nLeft = *pSrc;
}
else
{
// 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
*pDst = (*pSrc << (8-nChar)) | nLeft; // 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> nChar; // 修改目标串的指针和计数值
pDst++;
nDst++;
} // 修改源串的指针和计数值
pSrc++;
nSrc++;
} // 返回目标串长度
return nDst;
}// 7bit解码
// 输入: pSrc - 源编码串指针
// nSrcLength - 源编码串长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmDecode7bit(const unsigned char* pSrc, char* pDst, 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)
{
// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f; // 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> (7-nByte); // 修改目标串的指针和计数值
pDst++;
nDst++; // 修改字节计数值
nByte++; // 到了一组的最后一个字节
if(nByte == 7)
{
// 额外得到一个目标解码字节
*pDst = nLeft; // 修改目标串的指针和计数值
pDst++;
nDst++; // 组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
} // 修改源串的指针和计数值
pSrc++;
nSrc++;
} // 输出字符串加个结束符
*pDst = '\0'; // 返回目标串长度
return nDst;
}
// 输入: pSrc - 源字符串指针
// nSrcLength - 源字符串长度
// 输出: pDst - 目标编码串指针
// 返回: 目标编码串长度
int gsmEncode8bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
// 简单复制
memcpy(pDst, pSrc, nSrcLength); return nSrcLength;
}// 8bit解码
// 输入: pSrc - 源编码串指针
// nSrcLength - 源编码串长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmDecode8bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
// 简单复制
memcpy(pDst, pSrc, nSrcLength); // 输出字符串加个结束符
*pDst = '\0'; return nSrcLength;
}// UCS2编码
// 输入: pSrc - 源字符串指针
// nSrcLength - 源字符串长度
// 输出: pDst - 目标编码串指针
// 返回: 目标编码串长度
int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nDstLength; // UNICODE宽字符数目
WCHAR wchar[128]; // UNICODE串缓冲区 // 字符串-->UNICODE串
nDstLength = MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128); // 高低字节对调,输出
for(int i=0; i<nDstLength; i++)
{
*pDst++ = wchar[i] >> 8; // 先输出高位字节
*pDst++ = wchar[i] & 0xff; // 后输出低位字节
} // 返回目标编码串长度
return nDstLength * 2;
}// UCS2解码
// 输入: pSrc - 源编码串指针
// nSrcLength - 源编码串长度
// 输出: pDst - 目标字符串指针
// 返回: 目标字符串长度
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, 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++; // 后低位字节
} // UNICODE串-->字符串
nDstLength = WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL); // 输出字符串加个结束符
pDst[nDstLength] = '\0'; // 返回目标字符串长度
return nDstLength;
}