【问题标题】:Convert Hexadecimal to Decimal in AVR Studio?在 AVR Studio 中将十六进制转换为十进制?
【发布时间】:2015-02-22 20:14:12
【问题描述】:

如何在 AVR Studio 中将十六进制(无符号字符类型)转换为十进制(整数类型)?

是否有任何内置函数可用于这些?

【问题讨论】:

  • 对于整数类型,十六进制和十进制只是人类的不同表示,实际数据总是二进制的。所以无论你在源代码中写0x0A还是10,在编译时都没有区别。
  • unsigned char b = 0x??; int i = b;
  • 您的问题不清楚。 “十六进制(无符号字符类型)”到底是什么意思?单个十六进制数字的 ASCII 表示?一个字符串(即一个 ASCII 字符数组)?或者只是一个二进制数,正如其他人在这里所建议的那样?一个例子可能会有所帮助。
  • 但是当我执行算术运算时,我没有得到预期的结果。那么如何将十六进制字符串(我使用串行通信接收)转换为相应的整数?
  • 试试sscanf(hex_string, "%x", &my_unsigned_int);,或my_int = strtol(hex_string, NULL, 16);

标签: c hex decimal avr


【解决方案1】:

在 AVR 上,我在使用传统的 hex 2 int 方法时遇到了问题:

char *z="82000001";
uint32_t x=0;
sscanf(z, "%8X", &x);

x = strtol(z, 0, 16);

他们只是提供了错误的输出,没有时间调查原因。

因此,对于 AVR 微控制器,我编写了以下函数,包括相关的 cmets 以使其易于理解:

/**
 * hex2int
 * take a hex string and convert it to a 32bit number (max 8 hex digits)
 */
uint32_t hex2int(char *hex) {
    uint32_t val = 0;
    while (*hex) {
        // get current character then increment
        char byte = *hex++; 
        // transform hex character to the 4bit equivalent number, using the ascii table indexes
        if (byte >= '0' && byte <= '9') byte = byte - '0';
        else if (byte >= 'a' && byte <='f') byte = byte - 'a' + 10;
        else if (byte >= 'A' && byte <='F') byte = byte - 'A' + 10;    
        // shift 4 to make space for new digit, and add the 4 bits of the new digit 
        val = (val << 4) | (byte & 0xF);
    }
    return val;
}

例子:

char *z ="82ABC1EF";
uint32_t x = hex2int(z);
printf("Number is [%X]\n", x);

将输出:

编辑:sscanf 也适用于 AVR,但对于较大的十六进制数字,您需要使用“%lX”,如下所示:

char *z="82000001";
uint32_t x=0;
sscanf(z, "%lX", &x);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2018-09-04
    • 2017-07-31
    • 2015-11-11
    • 2013-07-20
    相关资源
    最近更新 更多