中間体としてベース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
おそらく、私が持っているよりも優れたエラー処理を追加したいと思うでしょう。私は、ここにきれいに収めるために、短い実装を撮影していました。