gpt4 book ai didi

c - 如何将十六进制转换为十进制?

转载 作者:太空宇宙 更新时间:2023-11-04 00:47:45 24 4
gpt4 key购买 nike

我有不同的十六进制数据要存储到一个整数类型的寄存器中。

当我使用 fprint 时,我可以看到以下内容:

0x3076
0x307c
.
.
.

但是,我想显示上述十六进制数据的十进制版本,如下所示。

12406
12412
.
.
.

理论上,假设您执行以下操作将第一个值转换为十进制。

(6* 16^0)+(7 * 16^1)+(0*16^2)+(3*16^3)=6 + 112+ 0 + 12288 = 12406

因此,如果我有“0x3076”的基于字符的版本,而且,如果我能够获得每个单个字符 6 - 7 - 0 - 3,我就可以计算小数!

所以,我决定将“3076”除以 1000。我本应得到 3,但我得到了两个字符!但是,如果我能够在“307c”的剩余部分获得 3,我将无法获得“C”。如果它是十进制的,这可能不适用于十六进制!

此外,我尝试了“strtol”命令。当我使用Cygwin编译我的代码时,我不确定错误在哪里!我做错了什么?

所以,我只需要找到一种方法从十六进制数据中获取每个单个字符!

有什么想法吗?

附言

这是我的代码,以帮助您给我一个想法。

   int get_readings(int source, int phase, int max_tries)
{
uint8_t buf[MAX_IEC1107_MSG_BODY];
uint8_t inbuf[MAX_IEC1107_MSG_BODY];
int inlen;
uint8_t *s;
int32_t value;
int status;
double voltage;
double current;
double active_power;
double reactive_power;
double apparent_power;
double power_factor;
double frequency;

s = buf;
*s++ = HOST_CMD_GET_READINGS_PHASE_1 + phase;
*s++ = 0x00;
if (max_tries != 1)
meter_set_max_tries(&emeter[source].meter_msg, max_tries);
if (meter_exchange(&emeter[source].meter_msg, buf, 2, inbuf, &inlen)
&&
inbuf[1] != 0xFF)
{
emeter[source].no_response = FALSE;
s = inbuf;
/* Get current readings */
value = (s[3] << 8) | s[2];

fprint(stderr, "value:" %p\n, value); // this give me HEX code

...

最佳答案

当读取一个表示十六进制数字的字符串时,使用strtol() 将其转换为一个长整数。然后,如果您想以十进制打印数字,请使用带有 %d 格式说明符的 printf()

char num[]="0x3076";
long n = strtol(num, NULL, 16);
printf("n=%ld\n", n); // prints 12406

一旦您使用 strtol 读入了 longs 的字符串并对 longs 进行了操作,数学应该会自行解决。

关于c - 如何将十六进制转换为十进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com