首页
社区
课程
招聘
[原创]memcpy在unicode,ASCII中的用法区别
2011-11-27 17:47 11515

[原创]memcpy在unicode,ASCII中的用法区别

2011-11-27 17:47
11515


在VS2010开发中,用到memcpy函数,虽然知道与在VC6.0中的用法是区别,但是还是碰了不少壁,在此总结一番,详情见windows核心编程。

1、在VC6.0中,默认的是ASCII字符集,因此以下函数会正常执行

char str[256];

CString strTemp = "helloworld"; //在MFC中测试。因此用得是CString

memcpy(str ,strTemp ,strTemp.GetLength() + 1);  //末尾加一是为了拷贝'\0'。

str中的值会成为helloworld。在内存中占的单元数是11个

2、同样的程序在VS2010中会拷贝不成功。

因为VS2010默认为UNICODE,memcpy在拷贝的时候将str的两个内存单元用来存放一个字节,也就是要成功保存,占用字节数

为11*2 = 22个

因此程序应为:

char str[256];

CString strTemp = "helloworld";

memcpy(str ,strTemp ,strTemp.GetLength() *2 + 2);

3  、可能你已经想到用TCHAR来声明,即如下:

TCHAR str[256];

CString strTemp = "helloworld";

memcpy(str ,strTemp ,strTemp.GetLength()  + 1);

经过测试,这样一样不会成功

原因是:memcpy函数只对内存单元进行操作,TCHAR str[256],只是多申请了256个单元,总单元数为256*2个,即相当于声明为:

char str[512]而已。

4、综上所述。在ASCII字符集中,memcpy函数操作的是将一个字节占用一个内存单元。

                       在UNICODE字符集中,占用的是两个内存单元

拷贝的时候,要注意第三个参数的使用,必须分配够足够的内存单元。


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞5
打赏
分享
最新回复 (6)
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
路独行 2011-11-27 18:40
2
0
我是初学者。。没有看明白UniCode下
怎么实现才能成功。。
雪    币: 57
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
朱哥哥 2011-11-27 19:01
3
0
只需分配足够的空间即可,主要是第三个参数要正确设置为在unicode下所以的内存单元数。一般为ascii下得两倍
雪    币: 93
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cdutboy 2011-11-27 19:07
4
0
...................
_MBCS -> _UNICODE......
雪    币: 203
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kennyl 2011-11-27 19:09
5
0
memcpy(str ,strTemp , (strTemp.GetLength()  + 1) * sizeof(strTemp[0])  );
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雪yaojun 2011-11-27 19:10
6
0
ASCII         |  UNICODE
---------------------------------
memcpy     |  wmemcpy
memcpy_s |  wmemcpy_s
雪    币: 203
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kennyl 2011-11-27 19:10
7
0
貌似这些放到新手区就OK了
游客
登录 | 注册 方可回帖
返回