打印

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

[复制链接]
5717|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 | 只看该作者
跟存储格式有关系

使用特权

评论回复
5
znmcu| | 2012-9-3 18:32 | 只看该作者
tmp=*((ulong *)a);

使用特权

评论回复
6
原野之浪| | 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

使用特权

评论回复
7
huzhiyang|  楼主 | 2012-9-3 19:29 | 只看该作者
tmp=*((ulong *)a);
znmcu 发表于 2012-9-3 18:32
明白你的意思了,不过出现这样的结果,应该跟存储格式有关。

使用特权

评论回复
8
znmcu| | 2012-9-3 19:42 | 只看该作者
跟大小端有关,51上应该正好相反

使用特权

评论回复
9
znmcu| | 2012-9-3 19:44 | 只看该作者
arm和avr上就是12345678了,51是大端

使用特权

评论回复
10
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单片机中与原始数据始终有点差别,改成你这种,完全没问题了。

使用特权

评论回复
11
NE5532| | 2012-9-3 20:10 | 只看该作者
union buye2long
{
unchar a[4];
ulong temp;
}i;

提示完毕。

使用特权

评论回复
12
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
你这种方法跟强制转换时一样的,也跟大小端有关系

使用特权

评论回复
13
NE5532| | 2012-9-3 20:19 | 只看该作者
呵呵,看来你看懂了。

使用特权

评论回复
14
baiyunfei.k.f| | 2012-9-4 08:38 | 只看该作者
用联合体,注意大小端

使用特权

评论回复
15
dlyt_test001| | 2012-9-4 08:51 | 只看该作者
路过,顶一下!

使用特权

评论回复
16
第二道彩虹| | 2012-9-4 13:49 | 只看该作者
12# huzhiyang 这种方法是可以做兼容的,既然用了联合,你可以用联合判断下是大端还是小端。

使用特权

评论回复
17
第二道彩虹| | 2012-9-4 13:50 | 只看该作者
12# huzhiyang 这种方法是可以做兼容的,既然用了联合,你可以用联合判断下是大端还是小端。

使用特权

评论回复
18
第二道彩虹| | 2012-9-4 13:55 | 只看该作者
12# huzhiyang 这种方法是可以做兼容的,既然用了联合,你可以用联合判断下是大端还是小端。

使用特权

评论回复
19
fzy_666| | 2012-9-4 14:11 | 只看该作者
union buye2long
{
unchar a[4];
ulong temp;
}i;

使用特权

评论回复
20
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

粉丝