将整数char []转换为hex char [] avr单片机

时间:2016-11-14 18:01:41

标签: c microcontroller avr

我正在寻找转换此类型的输入变量:

char var[] = "9876543210000"

到十六进制等效字符

char hex[] = "08FB8FD98210"

我可以通过例如以下代码::

long long int freq;
char hex[12];
freq = strtoll(var,NULL,10);
sprintf(hex, "%llX",freq);

但是我在avr微控制器上这样做,因此strtoll不仅仅是strtol(avr-libgcc)。所以我限制为32位整数,这是不够的。有什么想法吗?

祝你好运 西蒙

3 个答案:

答案 0 :(得分:2)

看起来您可能需要一次解析输入一个数字,并将结果保存到uint64_t变量中。

uint64_t结果变量初始化为0.在循环中,将结果乘以10并将下一个数字转换为int。

现在以十六进制打印数字,您可以使用sprintf()两次。首先打印result >> 32作为长无符号整数,然后(long unsigned int)result &hex[4](或6或8或任何地方),以获取剩余的32位。

您需要正确指定格式才能使数组中的字符位于正确的位置。或许,只需用0填充它?不要忘记尾随空字符的空间。

答案 1 :(得分:2)

是....此方法仅适用于正数,因此如果您有减号,请在下一步之前保存。只需将字符串数字分成两半,假设您选择每个六位数字,以获得两个十进制数字:u_int32_t left_part;u_int32_t right_part;以及您的数字的两半。 ...您可以按如下方式构建64位数字:

u_int64_t number = (u_int64_t) left_part * 1000000 + right_part;

如果您在打印方面遇到同样的问题,也就是说,您无法打印32位十六进制数字,则可以获取left_part = number >> 32;right_part = number & 0xffffffff;,最后打印两个:

if (left_part) printf("%x%08x", left_part, right_part);
else printf("%x", right_part);

当测试小于0x100000000时,测试结果不会强制为8位数。

答案 2 :(得分:1)

改变这个:

freq = strtoll(var,NULL,10);

对此:

sscanf(var,"%lld",&freq);