我正在为Atmel微控制器编写一些代码。我通过Uart获取一些数据,并将这些十六进制值存储到一个数组中。
假设数组的元素是:1F,29和3C。
我希望有一个十六进制数,如0x1F293C,并将其转换为十进制数。所以,我想最后得到“2042172”。
数组可以有n个元素,所以我需要一个通用的解决方案。
谢谢。
答案 0 :(得分:1)
如果你有一组像"0x1F293C"
这样的字符并希望将其转换为int
,请尝试以下代码:
char receivedByte[] = "0x1F293C";
char *p;
int intNumber = strtol(receivedByte, &p, 16);
printf("The received number is: %ld.\n", intNumber);
答案 1 :(得分:1)
sprintf(buffer, "%d", (((unsigned)array[0])<<16)+(((unsigned)array[1])<<8)+(unsigned)array[2];
这会将array
中的十六进制值写成buffer
,作为十进制表示的可读字符串。
假设sizeof(int)=4
答案 2 :(得分:0)
如果在评论(data
)中声明char data[]={0x1F, 0x29, 0x3C}
,则可以运行此程序。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char receivedByte[9], *p;
char data[] = { 0x1F, 0x29, 0x3C };
sprintf(receivedByte, "0x%X%X%X", data[0], data[1], data[2]);
int intNumber = strtol(receivedByte, &p, 16);
printf("The received number is: %ld.\n", intNumber);
return 0;
}
答案 3 :(得分:0)
如果输入由 n 字节组成,并且从指针array
开始存储,则可以按照接收的顺序添加值&#34;它们 - 即按照它们在数组中写入的顺序。
unsigned int convertToDecimal (unsigned char *array, int n)
{
unsigned int result = 0;
while (n--)
{
result <<= 8;
result += *array;
array++;
}
return result;
}
请注意,您的示例输入包含3个字节,并且您需要 n 字节&#34;的&#34;通用解决方案,因此您可能会用尽空间 >快。此功能仅适用于0..4个字节。如果需要更多字节,可以切换到long long
(当前为8个字节)。
对于比您需要切换到BigNum库更长的序列。
答案 4 :(得分:0)
#include <stdio.h>
int main(){
char data[] = {0x1F, 0x29, 0x3C};
int i, size = sizeof(data);
unsigned value = 0;
for(i=0;i<size;++i)
value = value * 256 + (unsigned char)data[i];
printf("0x%X %d\n", value, (int)value);
return 0;
}