将整数 char[] 转换为十六进制 char[] avr 微控制器

Convert integer char[] to hex char[] avr microcontroller

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

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 位整数,这是不够的。有什么想法吗?

此致 西蒙

改变这个:

freq = strtoll(var,NULL,10);

为此:

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

看起来您可能必须一次解析输入的一位数字,并将结果保存到 uint64_t 变量中。

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

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

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

是的....此方法仅适用于正数,因此如果您有负号,请在下一步之前保存它。只需将字符串编号分成两半,假设您 select 每个 六位数字 ,得到两个十进制数: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位。