免费注册 查看新帖 |

Chinaunix

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

freescale .mx27开发板中int与char数组相互转换的奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-21 16:33 |只看该作者 |倒序浏览
下面为一简单测试代码:

unsigned char buf[8];
memset(buf, 0, sizeof(buf));

// 模拟组帧
buf[0] = 0x01;
*(unsigned short *)&buf[1] = 0x1234;

// printf结果 34 12 00 00 00 00 00 00
int i;
for(i=0; i<sizeof(buf); i++)
{
printf("%02X ", buf[i]);
}
printf("\n");

// 模拟解帧
memset(buf, 0, sizeof(buf));
buf[1] = 0x12;
buf[2] = 0x34;
unsigned short v16 = *(unsigned short *)&buf[1];
// printf结果 v16=0x1200
printf("v16=0x%X\n", v16);

这是什么问题?!是底层CPU的原因吗?此代码在windows、unix、和普通linux系统下测试均无问题!请大家指教。

论坛徽章:
1
射手座
日期:2013-11-07 09:19:48
2 [报告]
发表于 2010-10-22 10:14 |只看该作者
没有细看你的测试数据。
建议LZ从“字节对齐alignment”和“字节序endian”这两方面考虑一下。

论坛徽章:
0
3 [报告]
发表于 2010-10-22 11:19 |只看该作者
本帖最后由 chenaiming2009 于 2010-10-22 14:36 编辑

不是字节对齐和字节序的问题!
是这种“ *(unsigned short *)&buf[1] = ...”赋值格式不认,系统还是在buf的首地址进行赋值,而不是从第2个字节开始赋值。为什么会这样?!

论坛徽章:
0
4 [报告]
发表于 2010-10-22 22:42 |只看该作者
这很明显是字节对齐的问题,地址 &buf[1] 不满足short变量2字节对齐的要求

论坛徽章:
0
5 [报告]
发表于 2010-10-22 22:53 |只看该作者
这种解码编码代码应该这样写:
unsigned short v16;
memcpy( &v16, &buf[1], sizeof(unsigned short) );
//视具体情况,后续在加上字节序转换,如 v16 = ntohs(v16);
或这样写:
v16 = (buf[1] << 8) | buf[2]; //视具体字节序情况或为:v16 = (buf[2] << 8) | buf[1];
编码的代码同理。

论坛徽章:
0
6 [报告]
发表于 2010-10-26 10:49 |只看该作者
你这个对了就奇怪了,
你上面的防在数组里面是
0    1    2    3
34  12  00  00

下面的是
0    1    2    4
00  12 34   00

你取出来当然是 0x 1200

论坛徽章:
0
7 [报告]
发表于 2010-10-26 22:34 |只看该作者
回复6楼:
执行:
buf[0] = 0x01;
*(unsigned short *)&buf[1] = 0x1234;
后数组中的值之所以是:
0    1    2    3
34  12  00  00
是因为:&buf[1] 地址不满足2字节对齐,所以“写偏”了。如果改成
buf[0] = 0x01;
buf[1] = 0x00;
*(unsigned short *)&buf[2] = 0x1234;
结果应该会正确,为:
0    1    2    3
1    0   34  12 //楼主的平台字节序为小端

要搞清楚这点:变量的地址是所在内存的起始地址,而不是结束地址。
所以6楼说的:
“0    1    2    4
00  12 34   00
你取出来当然是 0x 1200”
是错的。
这里取出来时取偏了也是因为对齐的问题,不信改成:
buf[2] = 0x12;
buf[3] = 0x34;
unsigned short v16 = *(unsigned short *)&buf[2];
printf("v16=0x%X\n", v16);
试试,结果应该是 0x3412  (楼主的平台字节序为小端)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP