在Arduino上从基数十二转换为十二,反之亦然

时间:2013-01-04 22:24:25

标签: c arduino

从十二点到十点的最有效方法是什么?反之亦然?

我尝试过多种转换方式,例如转换为字符串,将每个字符串指定为值,乘以base^exponent以获取该字符串中的值,然后获取总数。

我想知道,有更好的方法吗?

首先,我将数字存储为十进制的字符串,并希望将其转换为十二进制字符串作为另一个字符串。我还希望能够将基数为12的数字(在一个字符串中)转换为十进制数字(在一个字符串中)。

1 个答案:

答案 0 :(得分:2)

如果你只使用base 2作为中间体,这很容易。你可以从任何基数的字符串转换为基数2,如下所示:

int x = strtol("12345", NULL, 10); // convert from base 10 string to integer
int y = strtol("12345", NULL, 12); // convert from base 12 string to integer

然后将转换为基数10是微不足道的:

sprintf(buf, "%d", y); // convert from integer to base 10 string

打印基数12中的数字有点困难 - 没有内置函数已经完成它,所以你需要编写自己的(用一些助手来保持干净):

void reverse(char *s)                // reverse a string in place
{
    char *e = s + strlen(s) - 1;     // find the end of the string
    char tmp;
    while (s < e)                    // loop to swap characters and move pointers
    {                                // towards the middle of the string
        tmp = *e;
        *e-- = *s;
        *s++ = tmp;    
    }
}

char digit(int x)        // turn an integer into a single digit
{
    if (x < 10)
        return '0' + x;       // 0-9
    else
        return 'a' + x - 10;  // a, b, c, d, e, f, g....
}

void tobase(char *s, int x, int base) // convert an integer into a string in
{                                     // the given base
    int r;
    char *p = s;
    while (x)
    {
        r = x % base;    // extract current digit
        x = x / base;    // divide to get lined up for next digit
        *p++ = digit(r); // convert current digit to character
    }
    *p = '\0';           // null terminate the string
    reverse(s);          // and reverse it, since we generated the digits 
}                        // backwards

您可以使用它:

tobase(buf, x, 12); // convert from integer to base 12 string

你可能想要添加比我那里更好的错误处理 - 我正在拍摄一个简短的实现,以便在这里干净地安装它。