找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1887|回复: 31
打印 上一主题 下一主题
收起左侧

怎么简洁的把0X138C转换成ASCII码

  [复制链接]
楼主
ID:824490 发表于 2022-2-11 11:24 | 显示全部楼层
        int n=0x138c;
        unsigned char k10 [5];       
        k10[0]=n / 10000 + 0x30;
        k10[1]=n / 1000 % 10+0x30;
        k10[2]=n / 100 % 10+0x30;
        k10[3]=n / 10 % 10+0x30;
        k10[4]=n % 10 + 0x30;
回复

使用道具 举报

沙发
ID:824490 发表于 2022-2-11 14:09 | 显示全部楼层
用sprintf打印字符串的方法可以是可以,但的消耗的代码空间是很吓人的。能不用,则尽量不用。。
回复

使用道具 举报

板凳
ID:824490 发表于 2022-2-11 17:01 | 显示全部楼层
PEB188 发表于 2022-2-11 14:49
要的就是这种函数转换

这种方式看上去简单,消耗空间可不简单!多出几百个字节不在话下!你还要效率不?
回复

使用道具 举报

地板
ID:824490 发表于 2022-2-11 17:06 | 显示全部楼层
void main()
{
  int n=0x138c;
  unsigned char k10[5];

        k10[0]=n/10000 + 0x30;
        k10[1]=n/1000 % 10+0x30;
        k10[2]=n/100 % 10+0x30;
        k10[3]=n/10 % 10+0x30;
        k10[4]=n%10 + 0x30;
       
while(1);       
}
//////////////////////////////////////////////////       
编译后的信息:
Build target 'Target 1'
compiling hex2dec.c...
linking...
Program Size: data=14.0 xdata=0 code=257
"hex2dec" - 0 Error(s), 0 Warning(s).

///////////////////////////////////////////////////


#include <reg52.h>
#include <stdio.h>


void main()
{
int k=0x138c;
unsigned char disbuf[5];
       
        sprintf(disbuf,"%05d",k);
       
while(1);       
}       

       
//////////////////////////////////////////////////       
编译后的信息:
Build target 'Target 1'
compiling hex2dec.c...
linking...
Program Size: data=40.1 xdata=0 code=1087
"hex2dec" - 0 Error(s), 0 Warning(s).
//////////////////////////////////////////////////       
回复

使用道具 举报

5#
ID:824490 发表于 2022-2-12 18:18 | 显示全部楼层
发表于 2022-2-12 17:09
能不能帮我测试下沙发的代码占用多少资源,我没有C51,用gcc测试可以用,有个小笔误,[n%/10]应该是[n%10 ...

19楼已给出结果了。。
另外:用Sprintf的方法,运行结果明显比老方法耗费更多的时间。
回复

使用道具 举报

6#
ID:824490 发表于 2022-2-12 20:39 | 显示全部楼层
dzbj 发表于 2022-2-12 19:05
前一阵我也问过类似的问题 就是大数拆位 有两位大佬给的方法都很牛 我是受益匪浅 介绍给吧

uint a=5004; ...

赞!学习了!
你这个方法,运行得出结果的速度最快,美中不足有2点:
空间占用略大(16+420),且结果是逆向的。数据的后期处理要注意点。
回复

使用道具 举报

7#
ID:824490 发表于 2022-2-12 20:46 | 显示全部楼层
dzbj 发表于 2022-2-12 19:05
前一阵我也问过类似的问题 就是大数拆位 有两位大佬给的方法都很牛 我是受益匪浅 介绍给吧

uint a=5004; ...

用  for(x=4;x>0;x--) 这个可以解决逆序问题
回复

使用道具 举报

8#
ID:824490 发表于 2022-2-12 20:57 | 显示全部楼层
田贺 发表于 2022-2-12 18:18
要代码简洁用sprintf,代价是多几百个字节;
沙发的有一些小错误,看似是兼顾程序量与大小的最优解法了, ...

这个好,赞!
可以说是这主题中最佳答案了。
速度快、占用空间最小的。。
回复

使用道具 举报

9#
ID:824490 发表于 2022-2-12 20:58 | 显示全部楼层
回复

使用道具 举报

10#
ID:824490 发表于 2022-2-12 23:49 | 显示全部楼层
发表于 2022-2-12 21:43
我用MinGW测试*ptr--没问题啊!为啥要改成ptr[3-i]?难道C51用指针效率非常低嘛?

应该是让数组掉个头。

void main()
{
unsigned char  x;
unsigned int n=65535;
unsigned char ptr[5];

for(x=5;x>0;x--)
{
   ptr[x-1]="0123456789"[n%10]-0X30;
   n/=10;
}
while(1);
}
/*/////编译后:
Build target 'Target 1'
linking...
Program Size: data=16.0 xdata=0 code=170
"test" - 0 Error(s), 0 Warning(s).
*/////////





回复

使用道具 举报

11#
ID:824490 发表于 2022-2-13 10:50 | 显示全部楼层
Y_G_G 发表于 2022-2-13 01:43
用C语言写程序就是图它省事的
sprintf会占用1K左右的代码空间,如果单片机的内存足够的话,sprintf实在是 ...

是的,写代码还要兼顾到应用场景。ARM内核的单片用sprintf就是很方便。但用在小体量的51内核上,就要认真考量一下了。
回复

使用道具 举报

12#
ID:824490 发表于 2022-2-16 20:30 | 显示全部楼层
PEB188 发表于 2022-2-16 13:11
这个for里面两句是什么意思啊

for(x=5;x>0;x--)
{
   ptr[x-1]="0123456789"[n%10]-0X30;
//x-1,配合(x=5;x>0;x--),把转换后的数值按“万千百十个”位的顺序存到数组ptr的0-4的单元中。
  //"0123456789":相当于一个数组码表
  //n%10 就是取n的个位数,这个数对应的码值从"0123456789"中取出,
  //-0X30,这个要看转换后的数值去处,比如,用来自定义显示段码,可以加上,
  //毕竟没有人能定义一个长达数10个的成 员的段码表,数码管的段码表一般就20(0x14)个以内
  //但如果是用来字库LCD显示,则可以不用,字库中的数据可是从00-94的。
   n/=10;//把n缩小10倍,并去除小数部分。
}

//明白了吗?不明白我再来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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