[C语言] 讨论,Keil C51字节整合为字函数

[复制链接]
734|20
 楼主 | 2019-2-6 23:55 | 显示全部楼层 |阅读模式
想实现如下功能:将一串unsigned char类型的数组转换成unsigned int类型的数组。
希望通过带参数的函数来实现,由于指针无法输出数组。所以就比较麻烦,那么各位能不能提供好的建议呢
| 2019-2-7 18:13 | 显示全部楼层
unsigned char UC_Buff[16];//下标0-15有效
unsigned short *pUS = (unsigned short *)UC_Buff;
然后通过pUS[i]来访问,i取值范围0-7有效

评分

参与人数 1威望 +1 收起 理由
SUUY79 + 1 很给力!
| 2019-2-7 23:57 | 显示全部楼层
  1. #include <reg52.h>

  2. unsigned char arr1[4]={0x00,0x80,0x01,0x00};
  3. unsigned int char2int(unsigned char * srcarr,unsigned char pos)
  4. {
  5.         unsigned int tempvar;
  6.         pos<<=1;
  7.         ((unsigned char *)&tempvar)[0]=srcarr[pos];
  8.         pos++;
  9.         ((unsigned char *)&tempvar)[1]=srcarr[pos];
  10.         return(tempvar);
  11. }
  12. void main()
  13. {
  14.         unsigned int t1,t2;
  15.         while(1)
  16.         {
  17.                 t1=char2int(arr1,0);
  18.                 t2=char2int(arr1,1);
  19.         }
  20. }
复制代码
| 2019-2-8 17:52 | 显示全部楼层
其实二楼用指针就很好啊,指定数据空间类型,编译后代码很好,调用了MOV A,@R0
  1. #include <reg52.h>
  2. unsigned char arr1[4];
  3. unsigned char i;
  4. unsigned int t1;
  5. unsigned int * c2i;
  6. void main()
  7. {
  8.         arr1[0]=0x12;
  9.         arr1[1]=0x34;
  10.         arr1[2]=0x56;
  11.         arr1[3]=0x78;
  12.         c2i=((unsigned int *)arr1);
  13.         while(1)
  14.         {
  15.                 t1=c2i[i];
  16.                 i++;
  17.         }
  18. }
复制代码
 楼主 | 2019-2-8 18:06 | 显示全部楼层
mohanwei 发表于 2019-2-7 18:13
unsigned char UC_Buff[16];//下标0-15有效
unsigned short *pUS = (unsigned short *)UC_Buff;
然后通过pU ...

谢谢回复,代码确实简洁好用。但是我想通过带参函数调用实现,能不能提供一个方案!谢谢
 楼主 | 2019-2-8 18:09 | 显示全部楼层

谢谢,我希望通过带参函数调用实现,不知有没有好的方法?
| 2019-2-8 18:39 | 显示全部楼层
SUUY79 发表于 2019-2-8 18:09
谢谢,我希望通过带参函数调用实现,不知有没有好的方法?

我3楼不是贴了吗
 楼主 | 2019-2-8 19:02 | 显示全部楼层
oufuqiang 发表于 2019-2-8 17:52
其实二楼用指针就很好啊,指定数据空间类型,编译后代码很好,调用了MOV A,@R0
...

2楼的代码测试了一下确实好用,我主要对Keil c51的指针这些东西理解不够,用不好。实际上通过全局变量我知道怎么实现,但是想通过带形参的函数调用就出现问题了,比如下面的代码,就是我现在使用的一个函数,能不能帮忙改成带参调用的函数呢?
void conv()
{
        unsigned char TempChar[7];
        unsigned int  TempInt[4];

        uchar i,j;       
        for (i=0; i<7; i++)
        {
                if(i>0)       
                {
                        if(!(i%2))
                        {
                                j++;
                                TempInt[j]=(((unsigned int)Temp[i-1]<<8)|Temp);
                        }
                }
                else TempInt[j]=Temp;       
        }
}
 楼主 | 2019-2-8 19:03 | 显示全部楼层
本帖最后由 SUUY79 于 2019-2-8 19:09 编辑
oufuqiang 发表于 2019-2-8 17:52
其实二楼用指针就很好啊,指定数据空间类型,编译后代码很好,调用了MOV A,@R0
...

2楼的代码测试了一下确实好用,我主要对Keil c51的指针这些东西理解不够,用不好。实际上通过全局变量我知道怎么实现,但是想通过带形参的函数调用就出现问题了,比如下面的代码,就是我现在使用的一个函数,能不能帮忙改成带参调用的函数呢?
void conv()
{
        unsigned char TempChar[7];
        unsigned int  TempInt[4];

        unsigned char i,j;        
        for (i=0; i<7; i++)
        {
                if(i>0)        
                {
                        if(!(i%2))
                        {
                                j++;
                                TempInt[j]=(((unsigned int)Temp[i-1]<<8)|Temp);
                        }
                }
                else TempInt[j]=Temp;        
        }
}
| 2019-2-9 10:21 | 显示全部楼层
mohanwei 发表于 2019-2-7 18:13
unsigned char UC_Buff[16];//下标0-15有效
unsigned short *pUS = (unsigned short *)UC_Buff;
然后通过pU ...

我觉得这个是最简单的方法
| 2019-2-10 23:24 | 显示全部楼层
unsigned int char2int(unsigned char * srcarr,unsigned char pos)
{
        return ((unsigned int *)srcarr)[pos];
}
还有很多种写法,拿走不谢。

评分

参与人数 1威望 +2 收起 理由
SUUY79 + 2 很给力!
 楼主 | 2019-2-11 16:39 | 显示全部楼层
linqing171 发表于 2019-2-10 23:24
unsigned int char2int(unsigned char * srcarr,unsigned char pos)
{
        return ((unsigned int *)sr ...

验证了一下,非常好用,因为还有问题所以谢谢先!
还想请教一下:比如
srcarr[]={0,1,2,3,4,5,6,7,8,9}
POS=0, return 0001,好理解
POS=1, return 0203,没有理解了,我的想法应该是0102才对,还是因为强制转换的原因?

这个解答完了,可以不谢
 楼主 | 2019-2-11 16:39 | 显示全部楼层
linqing171 发表于 2019-2-10 23:24
unsigned int char2int(unsigned char * srcarr,unsigned char pos)
{
        return ((unsigned int *)sr ...

验证了一下,非常好用,因为还有问题所以谢谢先!
还想请教一下:比如
srcarr[]={0,1,2,3,4,5,6,7,8,9}
POS=0, return 0001,好理解
POS=1, return 0203,没有理解了,我的想法应该是0102才对,还是因为强制转换的原因?

这个解答完了,可以不谢
| 2019-2-12 11:56 | 显示全部楼层
unsigned int A[3]={0x0102,0x0304,0x0506};
unsigned int *p=A;
p[1]是0x0102,而不是0x0203;
因为p[0]占了两个字节,但是p[1]的起始位置是从第二个字节开始的,而不是从第一个字节开始。
在keil c51里面 sizeof(unsigned int)是2;
p++对应的汇编代码也是p指向的地址增加了2,而不是增加1;
| 2019-2-13 08:40 | 显示全部楼层
int atoi(const char *nptr);

标准库函数
| 2019-2-13 09:15 | 显示全部楼层
typedef union __UN_TRANS_U32_2_BYTE
{
    uint32_t data;
    uint8_t  byte[4];
} UN_TRANS_U32_2_BYTE;
UN_TRANS_U32_2_BYTE *trans_32bits_data;

uint32_t trans_byte_to_int(byte *byte_str)
{
    trans_32bits_data = (UN_TRANS_U32_2_BYTE *)byte_str;
    return  trans_32bits_data->data;
}
 楼主 | 2019-2-13 14:46 | 显示全部楼层
linqing171 发表于 2019-2-12 11:56
unsigned int A[3]={0x0102,0x0304,0x0506};
unsigned int *p=A;
p[1]是0x0102,而不是0x0203;

受教了,非常感谢。对C51和指针还需要加强!
 楼主 | 2019-2-13 14:47 | 显示全部楼层
kingkits 发表于 2019-2-13 09:15
typedef union __UN_TRANS_U32_2_BYTE
{
    uint32_t data;

这个应该是把字节整合成长整型吧
 楼主 | 2019-2-13 14:48 | 显示全部楼层
ayb_ice 发表于 2019-2-13 08:40
int atoi(const char *nptr);

标准库函数

这个标准库没有用过,要包含哪个头文件呢?
| 2019-2-13 14:55 | 显示全部楼层
SUUY79 发表于 2019-2-13 14:48
这个标准库没有用过,要包含哪个头文件呢?

stdlib.h
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

快速回复 返回顶部 返回列表