如何将字节数组(包含十六进制值)转换为十进制

时间:2014-08-16 16:12:04

标签: c arrays hex decimal atmega

我正在为Atmel微控制器编写一些代码。我通过Uart获取一些数据,并将这些十六进制值存储到一个数组中。

假设数组的元素是:1F,29和3C。

我希望有一个十六进制数,如0x1F293C,并将其转换为十进制数。所以,我想最后得到“2042172”。

数组可以有n个元素,所以我需要一个通用的解决方案。

谢谢。

5 个答案:

答案 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;
}