一个关于指针++的问题

liuharris 2010-05-06 02:48:08
下面是7-bit编码代码,str为="Hello",输出到编辑框控件(IDC_DATA)的内容为 c8329bfd06
假如红色部分代码用蓝色的代码代替,每while循环一次,数组pDst[0]的内容都会被替换,最后只剩下 06 ,
即编辑框的内容为0600000000,请问为什么不能通过pDst++ 指针+1 来实现数据的保存?
CString str="Hello";
const char *pSrc = LPCTSTR(str);
unsigned char pDst[20];
int nSrcLength = strlen(pSrc);
int nSrc; // 源字符串的计数值
int nDst; // 目标编码串的计数值
int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7
unsigned char nLeft; // 上一字节残余的数据

// 计数值初始化
nSrc = 0;
nDst = 0;
int i=0; // 删除
// 将源串每8个字节分为一组,压缩成7个字节
// 循环该处理过程,直至源串被处理完
// 如果分组不到8字节,也能正确处理
while (nSrc < nSrcLength)
{
// 取源字符串的计数值的最低3位
nChar = nSrc & 7;

// 处理源串的每个字节
if(nChar == 0)
{
// 组内第一个字节,只是保存起来,待处理下一个字节时使用
nLeft = *pSrc;
}
else
{
// 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节

pDst[i] = (*pSrc << (8-nChar)) | nLeft; //*pDst = (*pSrc << (8-nChar)) | nLeft;

// 将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> nChar;

// 修改目标串的指针和计数值
i++; //pDst++;

}
nDst++;
// 修改源串的指针和计数值
pSrc++;
nSrc++;
}
pDst[i] = nLeft; // *pDst = nLeft;

CString s, strs;
for(int j=0; j<nSrcLength; j++)
{
s.Format("%02x", pDst[j]);
strs += s;
}
SetDlgItemText(IDC_DATA, strs);//输出到编辑框
...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuharris 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oldn_cc_bird 的回复:]
..不是控制台,是你的pDst发生了转变
你上面的程序是通过gsmEncode7bit(uchar*, uchar*..)这个调的,到函数里后pDst变由原来的数组变成指针了
[/Quote]

刚试过了,我通过函数把指针传递进入也是一样的问题
oldn123 2010-05-06
  • 打赏
  • 举报
回复
..不是控制台,是你的pDst发生了转变
你上面的程序是通过gsmEncode7bit(uchar*, uchar*..)这个调的,到函数里后pDst变由原来的数组变成指针了
liuharris 2010-05-06
  • 打赏
  • 举报
回复
我在控制台程序下用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++;
}
*pDst = nLeft;
// 返回目标串长度
return nDst;
}


void main()
{
const char *pSrc = "Hello";
unsigned char pDst[20];
memset(pDst, 0, 20);
int i = gsmEncode7bit(pSrc, pDst, 5);
printf("-------Input--------\n %s\n", pSrc);
printf("-------Output--------\n");
printf("gsmEncode7bit = %d\n", i);
//cout<<i<<endl<<pDst[1]<<endl;
for (i = 0; i<5; i++)
{
printf("pDst[%d]=%02x\n", i, pDst[i]);
}
}

输出结果如下:
--------Input---------
Hello
--------Output--------
gsmEnclde7bit=5
pDst[0]=c8
pDst[1]=32
pDst[2]=9b
pDst[3]=fd
pDst[4]=06
oldn123 2010-05-06
  • 打赏
  • 举报
回复
应该定义成指针来用吧..数组怕是不成
liuharris 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oldn_cc_bird 的回复:]
pDst 是怎么定义的?这主要取决于pDst类型
++操作是每次+ sizeof(TYPE)
[/Quote]

unsigned char pDst[20];
oldn123 2010-05-06
  • 打赏
  • 举报
回复
pDst 是怎么定义的?这主要取决于pDst类型
++操作是每次+ sizeof(TYPE)

16,472

社区成员

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

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

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