发新帖本帖赏金 50.00元(功能说明)我要提问
12下一页
返回列表
打印
[技术讨论]

C语言十六进制数组转换成十进制数组

[复制链接]
892|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦幻泡影|  楼主 | 2023-3-7 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,最近在做进制转换的时候卡壳了,想请问一下各位大牛,有没有将一个十六进制数组转换成十进制的算法?例如数组A[8] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 转成十进制后表示成B[19] = {1, 3, 1, 1,  7, 6, 8, 4, 6, 7, 2, 9, 4, 8, 9, 9, 6, 9, 5};如果十六进制数组元素多一些咋办呢?

使用特权

评论回复
评论
TJM2613 2023-3-8 17:02 回复TA
比如: 0x1234 = 4660 0x2234 = 8756 0x1134 = 4404 上面3个16转换完后,每个10进制的个位数都不同,我觉得是很难的。以上只是个人看法哈 
TJM2613 2023-3-8 16:56 回复TA
我觉得16进制的数太多的话是实现不了的,首先16进制的位数你是可以获取的,然后用最傻瓜的进制转换:16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……以此类推,然后每个数相加,再显示出来,这是无法避免的,还有得考虑到会不会溢出的问题。而且10进制的个数与16进制的每一个位数都有关系。 
沙发
LcwSwust| | 2023-3-7 16:39 | 只看该作者
我没看明白,A数组的0x12与B数组的1、3有啥关系?

使用特权

评论回复
板凳
梦幻泡影|  楼主 | 2023-3-7 17:51 | 只看该作者
LcwSwust 发表于 2023-3-7 16:39
我没看明白,A数组的0x12与B数组的1、3有啥关系?

可以理解成0x1234567890ABCDEF转换成十进制后就变成了1311768467294899695

使用特权

评论回复
地板
LcwSwust| | 2023-3-7 18:01 | 只看该作者
本帖最后由 LcwSwust 于 2023-3-7 18:12 编辑
梦幻泡影 发表于 2023-3-7 17:51
可以理解成0x1234567890ABCDEF转换成十进制后就变成了1311768467294899695

我以为是8位,结果却是64位。
如果编译器支持64位变量,那无非就是把这8字节拼接成一个64位变量,
然后对10取余得到个位,
除以10,然后对10取余得到十位,
再除以10,然后对10取余得到百位,
......

更多的数据位,估计得自己专门写个除法、取余的函数。
估计应该有某些库。
百度一下:超长整数 四则运算

使用特权

评论回复
5
梦幻泡影|  楼主 | 2023-3-7 18:15 | 只看该作者
LcwSwust 发表于 2023-3-7 18:01
我以为是8位,结果却是64位。
如果编译器支持64位变量,那无非就是把这8字节拼接成一个64位变量,
然后对1 ...

64位的运算没问题,主要是特殊时候要处理80位的数据

使用特权

评论回复
评论
zyj9490 2023-3-7 22:03 回复TA
数据结构书上有实列的,清华的那本有的。 
6
zyj9490| | 2023-3-7 22:01 | 只看该作者
本帖最后由 zyj9490 于 2023-3-7 22:05 编辑
梦幻泡影 发表于 2023-3-7 18:15
64位的运算没问题,主要是特殊时候要处理80位的数据

以10为余,取出个数,除10,得新数,新数再余10,得十位数,除10,作新数,。。。。以此类推,值到除10为零结束。以上是LONG INT,扩展先以64位取余即可。

使用特权

评论回复
7
dw772| | 2023-3-8 13:21 | 只看该作者

本帖最后由 dw772 于 2023-3-8 13:27 编辑

说明你不懂单片机的存储原理和运行机理,你这样转换等于多此一举,无论你怎么转换还是16进制数存在于单片机的内存中,只是你以为的十进制是16进制数以十进制数“显示出来”给你看而已。不知道我这样说清楚没有

使用特权

评论回复
8
jekey| | 2023-3-8 13:34 | 只看该作者
dw772 发表于 2023-3-8 13:21
说明你不懂单片机的存储原理和运行机理,你这样转换等于多此一举,无论你怎么转换还是16进制数存在于单片机 ...

转换为10进制,一般就是用于显示给人看的。

使用特权

评论回复
9
xch| | 2023-3-8 16:02 | 只看该作者
把十六进制序列切机相同长度。每一段都转换成十进制序列,按照十进制每位占据一字节,得到差2^N的几段十进制序列。
然后用小学生乘法把几段十进制序列乘2^n ,加在一起

使用特权

评论回复
10
梦幻泡影|  楼主 | 2023-3-8 17:59 | 只看该作者
jekey 发表于 2023-3-8 13:34
转换为10进制,一般就是用于显示给人看的。

还是你懂我

使用特权

评论回复
11
梦幻泡影|  楼主 | 2023-3-8 18:01 | 只看该作者
xch 发表于 2023-3-8 16:02
把十六进制序列切机相同长度。每一段都转换成十进制序列,按照十进制每位占据一字节,得到差2^N的几段十进 ...

现在MCU能存储的最长数据只有8byte,如果要运算10byte以上的就搞不定了,得用特殊算法

使用特权

评论回复
12
xch| | 2023-3-8 18:11 | 只看该作者
梦幻泡影 发表于 2023-3-8 18:01
现在MCU能存储的最长数据只有8byte,如果要运算10byte以上的就搞不定了,得用特殊算法 ...

就是小学生都会的算法

使用特权

评论回复
13
xch| | 2023-3-9 07:46 | 只看该作者
我写了一个转换代码。
不知道为啥二姨不让发表,说里面有敏感词

使用特权

评论回复
14
xch| | 2023-3-9 07:52 | 只看该作者

使用特权

评论回复
15
xch| | 2023-3-9 07:53 | 只看该作者

使用特权

评论回复
16
xch| | 2023-3-9 07:56 | 只看该作者
Input HEX String:1234567890abcdef0
DEC string:20988295476718395120
用单片机算,瞬间完成

使用特权

评论回复
17
xch| | 2023-3-9 07:59 | 只看该作者

使用特权

评论回复
18
xch| | 2023-3-9 08:01 | 只看该作者
#define MAXIUM_INPUT_NUM 40
#define MAXIUM_OUTPUT_DIGI (MAXIUM_INPUT_NUM * 2)

uint8_t dec_string[MAXIUM_OUTPUT_DIGI+1], hex_string[MAXIUM_INPUT_NUM];
uint8_t index_hex = 0, index_dec = 0;
uint8_t cnt = 0;

uint8_t echo(uint8_t inp) {
  if ((inp =='\n')||(inp=='\r'))
  {
    printf("\n Input HEX String:");
    for (uint8_t i = 0; i < cnt; i++) {
      printf("%x", hex_string[i]);
    }
    printf("\n");
    return 0;
  }

  if ((inp >= '0') && (inp <= '9'))
    inp = inp - '0';
   else if( (inp >= 'a') && (inp <= 'f'))
    inp =inp-'a'+10;
  else  if( (inp >= 'A') && (inp <= 'F'))
    inp =inp-'A'+10;
    else return 1;
   
    if (cnt < MAXIUM_INPUT_NUM) {
      hex_string[cnt] = inp;
      cnt++;
    }
    printf("%x", inp);
    return 1;

}

使用特权

评论回复
19
xch| | 2023-3-9 08:02 | 只看该作者
void add_proc(uint8_t inp,uint8_t digi)
{
  uint8_t carray;
  if (inp==0) return;
  dec_string[digi] +=  inp;
  carray = dec_string[digi]/10;
  dec_string[digi]=dec_string[digi]%10;
  if (carray)
  {
    add_proc(carray,digi+1);
  }
}

使用特权

评论回复
20
xch| | 2023-3-9 08:03 | 只看该作者
这里面有敏感词?

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

287

帖子

6

粉丝