在线,简单,马上给分 ,多分!

sunjing0204 2005-11-07 10:23:11
// 8-bit解码
nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2); // 格式转换

我发觉此处格式转换有问题,导致8BIT信息解码都为空,这是为什么?
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
int CSms::gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
for(int i=0; i<nSrcLength; i+=2)
{
// 输出高4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}

pSrc++;

// 输出低4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst |= *pSrc - '0';
}
else
{
*pDst |= *pSrc - 'A' + 10;
}

pSrc++;
pDst++;
}

// 返回目标数据长度
return nSrcLength / 2;
}
...全文
197 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
T97102003 2005-11-07
  • 打赏
  • 举报
回复
int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
char temp[3];
for(int i=0; i<nSrcLength / 2; i++)
{
temp[0] = pSrc[i*2];
temp[1] = pSrc[i*2+1];
pDst[i] = (char)strtoul(temp, NULL, 16);
}

return nSrcLength / 2;
}
sunjing0204 2005-11-07
  • 打赏
  • 举报
回复
?????帮帮忙哦!
马上给分的啊!
goodheartppl 2005-11-07
  • 打赏
  • 举报
回复
同意楼上的
Snow_Ice11111 2005-11-07
  • 打赏
  • 举报
回复
至于你问的“我发觉此处格式转换有问题,导致8BIT信息解码都为空,这是为什么?”

那是因为你参数传送的方法不对,不能用传值方法的啦。
Snow_Ice11111 2005-11-07
  • 打赏
  • 举报
回复
1  根据你的意思我对题中作了一点改动:上面的代码实际上我把你的函数原型改成了unsigned char * gsmString2Bytes(const char* pSrc,int nSrcLength);省去了一个参数,且返回数值的类型也改成了unsigned char *类型了,因为我觉得这样更好一些,同样可以完成你想要的功能;
2  "D2F4C0D6BAD0BAC3D0C4B7D6CAD6"表示“音乐盒好心分手”这七个汉字的对应编码;
3  这段代码在我的机器上(XP系统,VC++ 6)上运行通过;
4  代码中有内存泄露,我没时间了,自己再改善一下。

Snow_Ice11111 2005-11-07
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <afx.h>

unsigned char * gsmString2Bytes(const char* pSrc,int nSrcLength)
{
int temp1=0,temp2=0;
unsigned char* pDst=new unsigned char[nSrcLength+1];
memset(pDst,0,nSrcLength+1);
for (int i=0;i<nSrcLength;i++)
{
if (pSrc[i*2]>='0' && pSrc[i*2]<='9') temp1=(int)pSrc[i*2]-48;
if (pSrc[i*2]>='a' && pSrc[i*2]<='f') temp1=(int)pSrc[i*2]-87;
if (pSrc[i*2]>='A' && pSrc[i*2]<='F') temp1=(int)pSrc[i*2]-55;
if (pSrc[i*2+1]>='0' && pSrc[i*2+1]<='9') temp2=(int)pSrc[i*2+1]-48;
if (pSrc[i*2+1]>='a' && pSrc[i*2+1]<='f') temp2=(int)pSrc[i*2+1]-87;
if (pSrc[i*2+1]>='A' && pSrc[i*2+1]<='F') temp2=(int)pSrc[i*2+1]-55;
pDst[i]=temp1*16+temp2;
}
return pDst;
}


void main()
{
char* a="D2F4C0D6BAD0BAC3D0C4B7D6CAD6";
CString str=a;
int nSrcLength=str.GetLength()/2;
cout<<gsmString2Bytes(a,nSrcLength)<<endl;
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧