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

2024-01-21

我有不同的十六进制数据传入并存储到整数类型寄存器中。

当我使用 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 编译我的代码时,我不确定错误在哪里!我做错了什么?

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

有什么想法吗?

P.S.

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

   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()将其转换为长整型。然后,如果您想以十进制打印数字,请使用printf() with a %d格式说明符。

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

一旦您使用 longs 读取字符串strtol并进行多头操作,数学应该会自行解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将十六进制转换为十进制? 的相关文章