免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4530 | 回复: 2
打印 上一主题 下一主题

[C] 内存拷贝 中间一个字符丢失,很奇怪??大家遇到过这种情况么??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-06 12:19 |只看该作者 |倒序浏览
做测试的时候发现的一个问题,字符串拷贝后丢失了一个字节 不在头也不在尾而是中间。

在一次测试时出现 ,后面的测试再没有发现过。

sMsg是源字符串 如 123456/78
buffer0 显示字符串 3132333435363738 2F也就是‘/’没有显示

这个转码函数用了多年了 没有发现过这个问题,'/'的消失弄得我也是一头雾水,以前没有碰到过。
大家谁碰到过类似的问题么 ????

我的猜测 转码函数的问题 系统内存的问题

stM_D_P 是一个结构体 stM_D_P.sMessage 结构体里的字符串数组

     memcpy(stM_D_P.sMessage,sMsg,ilength);  

     iLen=stM_D_P.nLength;   
     High_Tran_Low((char *)&stM_D_P.nLength,sizeof(short));
     memcpy(sSnd_Buff,(unsigned char *)&stM_D_P,iLen);
     sSnd_Buff[iLen]=0;
      
     gsmBytes2String(sSnd_Buff,buffer0,iLen);

printf("Send_Msg  16jinzhi:[%s]\n",buffer0);


int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
                char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
                int i = 0 ;
                for (; i < nSrcLength; i++)
                {
                        *pDst++ = tab[*pSrc >> 4]; // 输出高4位
                        *pDst++ = tab[*pSrc & 0x0f]; // 输出低4位
                        pSrc++;
                }

                // 输出字符串加个结束符
        *pDst = '\0';

        // 返回目标字符串长度
        return (nSrcLength * 2);
}

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
2 [报告]
发表于 2013-08-06 13:51 |只看该作者
内存越界什么的吧. 你gdb watch这个地址跟一下就好了.

系统内存的问题?别这样想--

论坛徽章:
0
3 [报告]
发表于 2013-08-07 10:34 |只看该作者
我试了下, 直接传入你的那串源字符串到 gsmBytes2String, 可以达到你以前的预期: 3132333435362F3738。

ASCII下, 是不是调用这个函数之前 / 被去掉了(High_Tran_Low)? 函数开头加输出试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP