12下一页
返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[技术讨论] C语言十六进制数组转换成十进制数组

[复制链接]
2430|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};如果十六进制数组元素多一些咋办呢?

评论

比如: 0x1234 = 4660 0x2234 = 8756 0x1134 = 4404 上面3个16转换完后,每个10进制的个位数都不同,我觉得是很难的。以上只是个人看法哈  发表于 2023-3-8 17:02
我觉得16进制的数太多的话是实现不了的,首先16进制的位数你是可以获取的,然后用最傻瓜的进制转换:16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……以此类推,然后每个数相加,再显示出来,这是无法避免的,还有得考虑到会不会溢出的问题。而且10进制的个数与16进制的每一个位数都有关系。  发表于 2023-3-8 16:56
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取余得到百位,
......

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

 楼主| 梦幻泡影 发表于 2023-3-7 18:15 | 显示全部楼层
LcwSwust 发表于 2023-3-7 18:01
我以为是8位,结果却是64位。
如果编译器支持64位变量,那无非就是把这8字节拼接成一个64位变量,
然后对1 ...

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

评论

数据结构书上有实列的,清华的那本有的。  发表于 2023-3-7 22:03
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位取余即可。
dw772 发表于 2023-3-8 13:21 | 显示全部楼层

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

说明你不懂单片机的存储原理和运行机理,你这样转换等于多此一举,无论你怎么转换还是16进制数存在于单片机的内存中,只是你以为的十进制是16进制数以十进制数“显示出来”给你看而已。不知道我这样说清楚没有
jekey 发表于 2023-3-8 13:34 | 显示全部楼层
dw772 发表于 2023-3-8 13:21
说明你不懂单片机的存储原理和运行机理,你这样转换等于多此一举,无论你怎么转换还是16进制数存在于单片机 ...

转换为10进制,一般就是用于显示给人看的。
xch 发表于 2023-3-8 16:02 | 显示全部楼层
把十六进制序列切机相同长度。每一段都转换成十进制序列,按照十进制每位占据一字节,得到差2^N的几段十进制序列。
然后用小学生乘法把几段十进制序列乘2^n ,加在一起
 楼主| 梦幻泡影 发表于 2023-3-8 17:59 | 显示全部楼层
jekey 发表于 2023-3-8 13:34
转换为10进制,一般就是用于显示给人看的。

还是你懂我
 楼主| 梦幻泡影 发表于 2023-3-8 18:01 | 显示全部楼层
xch 发表于 2023-3-8 16:02
把十六进制序列切机相同长度。每一段都转换成十进制序列,按照十进制每位占据一字节,得到差2^N的几段十进 ...

现在MCU能存储的最长数据只有8byte,如果要运算10byte以上的就搞不定了,得用特殊算法
xch 发表于 2023-3-8 18:11 | 显示全部楼层
梦幻泡影 发表于 2023-3-8 18:01
现在MCU能存储的最长数据只有8byte,如果要运算10byte以上的就搞不定了,得用特殊算法 ...

就是小学生都会的算法
xch 发表于 2023-3-9 07:46 | 显示全部楼层
我写了一个转换代码。
不知道为啥二姨不让发表,说里面有敏感词
xch 发表于 2023-3-9 07:52 | 显示全部楼层

本帖子中包含更多资源

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

×
xch 发表于 2023-3-9 07:53 | 显示全部楼层

本帖子中包含更多资源

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

×
xch 发表于 2023-3-9 07:56 | 显示全部楼层
Input HEX String:1234567890abcdef0
DEC string:20988295476718395120
用单片机算,瞬间完成
xch 发表于 2023-3-9 07:59 | 显示全部楼层

本帖子中包含更多资源

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

×
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;

}
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);
  }
}
xch 发表于 2023-3-9 08:03 | 显示全部楼层
这里面有敏感词?

本帖子中包含更多资源

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

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

本版积分规则

20

主题

296

帖子

6

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