C 将整型字符[]转换为十六进制字符[]avr微控制器
我希望转换这种类型的输入变量:C 将整型字符[]转换为十六进制字符[]avr微控制器,c,microcontroller,avr,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)可用。所以我被限制
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);
更改此项:
freq = strtoll(var,NULL,10);
为此:
sscanf(var,"%lld",&freq);
看起来您可能需要一次解析一个数字的输入,并将结果保存到
uint64\u t
变量中
将uint64\t
结果变量初始化为0。在循环中,将结果乘以10,然后将转换为整数的下一个数字相加
现在要以十六进制打印数字,可以使用sprintf()两次。首先将result>>32
打印为长无符号整数,然后在&hex[4]
(或6或8或任何位置)处打印(长无符号整数)result
,以提取剩余的32位
您需要正确指定格式,才能将数组中的字符放在正确的位置。也许,用0填充它?不要忘记为后面的空字符留出空间。看起来您可能需要一次解析一位输入,然后将结果保存到
uint64\t
变量中
将uint64\t
结果变量初始化为0。在循环中,将结果乘以10,然后将转换为整数的下一个数字相加
现在要以十六进制打印数字,可以使用sprintf()两次。首先将result>>32
打印为长无符号整数,然后在&hex[4]
(或6或8或任何位置)处打印(长无符号整数)result
,以提取剩余的32位
您需要正确指定格式,才能将数组中的字符放在正确的位置。也许,用0填充它?不要忘了为后面的空字符留出空间。是。。。。这个方法只适用于正数,所以如果您有负号,只需在执行下一步之前保存它即可。只需将字符串数分成两半,假设您分别选择六位数字,得到两个十进制数:
u_int32_t left_部分代码>和u\u int32\u t right\u部分代码>与您的两个号码的一半。。。。您可以按如下方式构造64位数字:
u_int64_t number = (u_int64_t) left_part * 1000000 + right_part;
如果您在打印端遇到同样的问题,即您只能打印32位十六进制数,您只需获得left\u part=number>>32代码>和右\u部分=编号&0xffffffff代码>并最终使用以下两种方式打印:
if (left_part) printf("%x%08x", left_part, right_part);
else printf("%x", right_part);
当结果小于0x100000000
是时,测试使结果不会强制为8位。。。。这个方法只适用于正数,所以如果您有负号,只需在执行下一步之前保存它即可。只需将字符串数分成两半,假设您分别选择六位数字,得到两个十进制数:u_int32_t left_部分代码>和u\u int32\u t right\u部分代码>与您的两个号码的一半。。。。您可以按如下方式构造64位数字:
u_int64_t number = (u_int64_t) left_part * 1000000 + right_part;
如果您在打印端遇到同样的问题,即您只能打印32位十六进制数,您只需获得left\u part=number>>32代码>和右\u部分=编号&0xffffffff代码>并最终使用以下两种方式打印:
if (left_part) printf("%x%08x", left_part, right_part);
else printf("%x", right_part);
当结果小于0x100000000
时,该测试使结果不必强制为8位,您不清楚自己从头开始实现的哪一部分?顺便说一句,strtoll
是一个标准的C函数,应该可以在任何符合标准的编译器上使用。据我所知,如果avr微控制器被限制为32位整数,那么您必须重新考虑输入是什么(意思),并找到一种不同的方法将其拆分为各个部分。@EugeneSh<代码>strtoll
在avr libc中不可用。您是否可以将输入字符串分成两部分(将长度限制为每个部分最多8位),然后使用strtol()分别转换左右部分。将左半部分的结果乘以适当的因子(10^x,其中x=右半部分的位数),然后将右半部分的结果相加。您不清楚自己从头开始实施的哪一部分?顺便说一句,strtoll
是一个标准的C函数,应该可以在任何符合标准的编译器上使用。据我所知,如果avr微控制器被限制为32位整数,那么您必须重新考虑输入是什么(意思),并找到一种不同的方法将其拆分为各个部分。@EugeneSh<代码>strtoll
在avr libc中不可用。您是否可以将输入字符串分成两部分(将长度限制为每个部分最多8位),然后使用strtol()分别转换左右部分。将左侧部分的结果乘以适当的因子(10^x,其中x=右侧部分的位数),然后从右侧添加结果。ll
选项在avr库中不可用。对于int32\u t
或double,它只有一个l
选项。@UncleO:OP只提到缺少strtoll
。您是说没有64位操作或操作数(即,long
)是可行的吗?64位操作可用,但scanf没有strtoll或ll选项。avr库中没有ll
选项。对于int32\u t
或double,它只有一个l
选项。@UncleO:OP只提到缺少strtoll
。您是说没有64位操作或操作数(即,long
)是可行的吗?64位操作可用,但scanf没有strtoll或ll选项。这很有效,谢谢!然而,似乎有一些事情我不能准确地理解。例如,字符*=“10000000000”被转换为9999995904,你知道为什么我没有得到完全相同的数字吗?只有当我离开时才是这样