我正在寻找转换此类型的输入变量:
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位整数,这是不够的。有什么想法吗?
祝你好运 西蒙
答案 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);