这段代码如何在碱基之间转换?

How does this code convert between bases?

#include<stdio.h>
#include<string.h>
void baseconversion(char s[20], int, int);
main()
{   
    char s[20];
    int base1, base2;
    printf("Enter the number and base:");
    scanf("%s%d", s, &base1);
    printf("Enter the base to be converted:");
    scanf("%d", &base2);
    baseconversion(s, base1, base2);
}

void baseconversion(char s[20], int b1, int b2)
{
    int count = 0, r, digit, i, n = 0, b = 1;
    for(i = strlen(s) - 1; i >= 0; i--)
    {
        if(s[i] >= 'A' && s[i] <= 'Z')
        {
            digit = s[i] - '0' - 7;
        }
        else
        {
            digit = s[i] - '0';
        }
        n = digit * b + n;
        b = b * b1;
    }
    while(n != 0)
    {
        r = n % b2;
        digit = '0' + r;
        if(digit > '9')
        {
            digit += 7;
        }
        s[count] = digit;
        count++;
        n = n / b2;
    }
    for(i = count - 1; i >= 0; i--)
    {
        printf("%c", s[i]);
    }
    printf("\n");
}

我知道这段代码将字符转换为整数,但我以前从未见过,从未使用过 C。
如果有人能解释一下转换过程中发生了什么,我将不胜感激,谢谢。
我知道在某些时候数字会颠倒。

分两步完成,第一步是将数字转化为小数形式,这部分:

for(i = strlen(s) - 1; i >= 0; i--)   //Start from right to left
{
    if(s[i] >= 'A' && s[i] <= 'Z')
        digit = s[i] - '0' - 7; //Get the integer equivalent to the letter
    else
         digit = s[i] - '0';    //Get the integer equivalent to the numerical character
    n = digit * b + n;   //Add the value of this character at this position
    b = b * b1;    //The value of the next character will be higher b times
}

然后将结果转换为所需的基数,在这部分:

while(n != 0)
{
    r = n % b2;    //The remaining will be the rightmost value for the new base
    digit = '0' + r;   //Get the integer for the new digit
    if(digit > '9')
        digit += 7;    //Here the digit will be a letter
    s[count] = digit;
    count++;
    n = n / b2;    //Remove the rightmost digit to get the next one
}