免费注册 查看新帖 |

Chinaunix

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

"位段结构类型"的memcpy()内存拷贝问题?!请大家指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-20 15:48 |只看该作者 |倒序浏览
本人定义了一个位段结构:
static struct packed_data {
    unsigned char a:8;
    unsigned char b:8;
    unsigned char c:8;
    unsigned char d:8;
} ;
目的为了对int类型的变量进行移位,然后将移位的结果拷贝到字符串内。
代码如下:
#include <stdio.h>
static struct packed_data {
    unsigned char a:8;
    unsigned char b:8;
    unsigned char c:8;
    unsigned char d:8;
} ;
extern void memcpy(char *,struct packed_data *,unsigned int);
main()
{
    struct packed_data * pkdat;
    unsigned int num,len;
    char * buf0;
    buf0=(char *)malloc(sizeof(char *));
    pkdat=(struct packed_data * )malloc(sizeof(struct packed_data));
    num=20202;
    printf("sizof(pkdat)=[%d]\n",sizeof(pkdat));
    printf("num=[%b]\n",num);
    pkdat->a=(num>>0);
    num>>=0;
    pkdat->b=(num>>;
    num>>=8;
    pkdat->c=(num>>16);
    num>>=16;
    pkdat->d=(num>>24);
    printf("pkdat->a num2b() is [%b]\n",pkdat->a);
    printf("pkdat->b num2b() is [%b]\n",pkdat->b);
    printf("pkdat->c num2b() is [%b]\n",pkdat->c);
    printf("pkdat->d num2b() is [%b]\n",pkdat->d);
    memset(buf0,0,sizeof(buf0));
    memcpy(buf0,pkdat,sizeof(pkdat));
    printf("pkdat =[%b]\n",pkdat);
    printf("buf0  =[%b]\n",buf0);
    free(buf0);
    free(pkdat);
}
此例中int变量为num=20202
我的本意是:
num[100111011101010]
右移后位段结构内容为
pkdat[11101010 01001110 00000000 00000000]
也就是4字节的num低位字节于高位字节顺序互换
并把结果保留到buf0
buf0[11101010 01001110 00000000 00000000]

但此代码运行结果如下:
sizof(pkdat)=[4]
num=[100111011101010]
pkdat->a num2b() is [11101010]
pkdat->b num2b() is [1001110]
pkdat->c num2b() is [0]
pkdat->d num2b() is [0]
pkdat =[10000000001100110100000]
buf0  =[10000000001100110011000]
请高手给指点迷津3Q:)

[ 本帖最后由 dourt 于 2006-4-20 15:55 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-04-20 17:05 |只看该作者
试一下:
pkdat->d=(num>>24);
num<<=8
pkdat->c=(num>>24);
num<<=8
pkdat->b=(num>>24);
num<<=8
pkdat->a=(num>>24);

论坛徽章:
0
3 [报告]
发表于 2006-04-21 09:34 |只看该作者
谢谢luopc你的代码也好用,
但接下来的问题是用memcpy()把int数据拷贝到char[]变量里
简而言之:
char buf0[20];
int    num;
num=202;
memcpy(buf0,num,sizeof(int));
这样执行后buf0里的内容并不是我想要的,
或者是我用memcpy()的方法有问题???

论坛徽章:
0
4 [报告]
发表于 2006-04-21 10:07 |只看该作者
union不行?
另外你好像没有考虑big endian/little endian的问题。
说错了别介意,每仔细看代码。

论坛徽章:
0
5 [报告]
发表于 2006-04-21 13:43 |只看该作者
"柳五随风"说的union我不懂的;至于big endian/little endian的问题没有考虑;而此问题正是针对这一问题而来,类似于htonl()函数的功能。
谢谢各位的关注,现已解决(利用了"luopc"提供的代码)整理如下:
char buf[4+1];
int num=202;
buf[3]=(num>>24);
num<<=8;
buf[2]=(num>>24);
num<<=8;
buf[1]=(num>>24);
num<<=8;
buf[0]=(num>>24);
此时buf中的内容即为num数值相反的字节序,还请各位继续指正
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP