如何将一个数组中的4个元素组成一个long型的数据

[复制链接]
6889|32
 楼主| huzhiyang 发表于 2012-9-3 17:59 | 显示全部楼层 |阅读模式
本帖最后由 huzhiyang 于 2012-9-3 18:03 编辑

例如:unsigned char a[4]
        unsigned long tmp;
       a[0]=0x12;
       a[1]=0x34;
       a[2]=0x56;
       a[3]=0x78;
      现在想将其组合成tmp= 0x12345678;
      我的做法是:
      
但是运行的结果是:

求解啊!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
znmcu 发表于 2012-9-3 18:06 | 显示全部楼层
指针强转
 楼主| huzhiyang 发表于 2012-9-3 18:13 | 显示全部楼层
本帖最后由 huzhiyang 于 2012-9-5 10:24 编辑

3# huzhiyang
原来我的两种方法是对的  格式输出错了,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hechnology 发表于 2012-9-3 18:31 | 显示全部楼层
跟存储格式有关系
znmcu 发表于 2012-9-3 18:32 | 显示全部楼层
tmp=*((ulong *)a);
原野之浪 发表于 2012-9-3 18:36 | 显示全部楼层
嗯 2楼说这样搞
unsigned long int  tmp = 0;

tmp = *(unsigned long int *)a;

和开端有关系?

不过我觉得最好的方法是


比如INT16U A[2] = 1,2

那么B= 1 *256  +  2  ×  1
 楼主| huzhiyang 发表于 2012-9-3 19:29 | 显示全部楼层
tmp=*((ulong *)a);
znmcu 发表于 2012-9-3 18:32
明白你的意思了,不过出现这样的结果,应该跟存储格式有关。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
znmcu 发表于 2012-9-3 19:42 | 显示全部楼层
跟大小端有关,51上应该正好相反
znmcu 发表于 2012-9-3 19:44 | 显示全部楼层
arm和avr上就是12345678了,51是大端
 楼主| huzhiyang 发表于 2012-9-3 20:09 | 显示全部楼层
嗯 2楼说这样搞
unsigned long int  tmp = 0;

tmp = *(unsigned long int *)a;

和开端有关系?

不过我觉得最好的方法是


比如INT16U A[2] = 1,2

那么B= 1 *256  +  2  ×  1 ...
原野之浪 发表于 2012-9-3 18:36
我也觉得你的这种方法是最好的,开始我这样做的:
    tmp = a[0];
    tmp = (tmp<<8)|a[1];
    tmp = (tmp<<8)|a[2];
    tmp = (tmp<<8)|a[3];在C51单片机中与原始数据始终有点差别,改成你这种,完全没问题了。
NE5532 发表于 2012-9-3 20:10 | 显示全部楼层
union buye2long
{
unchar a[4];
ulong temp;
}i;

提示完毕。
 楼主| huzhiyang 发表于 2012-9-3 20:14 | 显示全部楼层
本帖最后由 huzhiyang 于 2012-9-3 20:23 编辑
union buye2long
{
unchar a[4];
ulong temp;
}i;

提示完毕。
NE5532 发表于 2012-9-3 20:10
你这种方法跟强制转换时一样的,也跟大小端有关系

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
NE5532 发表于 2012-9-3 20:19 | 显示全部楼层
呵呵,看来你看懂了。
baiyunfei.k.f 发表于 2012-9-4 08:38 | 显示全部楼层
用联合体,注意大小端
dlyt_test001 发表于 2012-9-4 08:51 | 显示全部楼层
路过,顶一下!
第二道彩虹 发表于 2012-9-4 13:49 | 显示全部楼层
12# huzhiyang 这种方法是可以做兼容的,既然用了联合,你可以用联合判断下是大端还是小端。
第二道彩虹 发表于 2012-9-4 13:50 | 显示全部楼层
12# huzhiyang 这种方法是可以做兼容的,既然用了联合,你可以用联合判断下是大端还是小端。
第二道彩虹 发表于 2012-9-4 13:55 | 显示全部楼层
12# huzhiyang 这种方法是可以做兼容的,既然用了联合,你可以用联合判断下是大端还是小端。
fzy_666 发表于 2012-9-4 14:11 | 显示全部楼层
union buye2long
{
unchar a[4];
ulong temp;
}i;
znmcu 发表于 2012-9-4 15:25 | 显示全部楼层
这是我的znFAT中对大小端无关性的处理:

/***********************************************************************************
功能:由一个小端排列的字节序列,计算得到其在某一字符长度下所表达的整型值
形参:dat:指向字节序列的指针 len:将字节序列的前len个字节计算整型值
返回:计算得到的整型值
详解:这一函数是屏蔽不同CPU在大小端上的差异的主要手段。比如对于一个小端的4字节序列
       unsigned char *p={0X12,0X34,0X56,0X78} 如果我们想把它合成为一个4字节整型,如
       unsigned long,那么可以这样来作 *((unsigned long *)p),但对于不同的CPU,因变
       量在RAM中的字节排列顺序不同,即大小端问题,则其所表达的整型值可能为0X12345678
       或 0X78563412,这将会出现错误。为了屏蔽这种差异,引入了此函数,通过对字节序列
       进行计算,最后将可以得到正确的值,对于上例中的字节序列,通过此函数的计算Bytes
       2Value(p,4)值一定为0X12345678。
***********************************************************************************/
UINT32 Bytes2Value(UINT8 *dat,UINT8 len)
{
UINT32 temp=0;

if(len>=1) temp|=((UINT32)(dat[0]))    ;
if(len>=2) temp|=((UINT32)(dat[1]))<<8 ;
if(len>=3) temp|=((UINT32)(dat[2]))<<16;
if(len>=4) temp|=((UINT32)(dat[3]))<<24;

return temp;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

190

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部