在 AVR Studio 中将十六进制转换为十进制?
Convert Hexadecimal to Decimal in AVR Studio?
如何在 AVR Studio 中将十六进制(unsigned char 类型)转换为十进制(int 类型)?
是否有可用于这些的内置函数?
在 AVR 上,我在使用传统的 hex 2 int 方法时遇到了问题:
char *z="82000001";
uint32_t x=0;
sscanf(z, "%8X", &x);
或
x = strtol(z, 0, 16);
他们只是提供了错误的输出,没有时间调查原因。
所以,对于AVR Microcontrollers,我写了下面的函数,包括相关的注释,以便于理解:
/**
* 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);
如何在 AVR Studio 中将十六进制(unsigned char 类型)转换为十进制(int 类型)?
是否有可用于这些的内置函数?
在 AVR 上,我在使用传统的 hex 2 int 方法时遇到了问题:
char *z="82000001";
uint32_t x=0;
sscanf(z, "%8X", &x);
或
x = strtol(z, 0, 16);
他们只是提供了错误的输出,没有时间调查原因。
所以,对于AVR Microcontrollers,我写了下面的函数,包括相关的注释,以便于理解:
/**
* 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);