Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将整型字符[]转换为十六进制字符[]avr微控制器_C_Microcontroller_Avr - Fatal编程技术网

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,你知道为什么我没有得到完全相同的数字吗?只有当我离开时才是这样