数字转换器(字符串格式的大整数)

时间:2013-08-02 00:59:47

标签: c# algorithm valueconverter

我正在尝试用C#编写一个将大数字(字符串格式)转换为任意数字系统的类,我在How to convert a gi-normous integer (in string format) to hex format? (C#)找到了这段代码

    var s = "843370923007003347112437570992242323";
    var result = new List<byte>();
    result.Add( 0 );
    foreach ( char c in s )
    {
        int val = (int)( c - '0' );
        for ( int i = 0 ; i < result.Count ; i++ )
        {
            int digit = result[i] * 10 + val;
            result[i] = (byte)( digit & 0x0F );
            val = digit >> 4;
        }
        if ( val != 0 )
            result.Add( (byte)val );
    }

    var hex = "";
    foreach ( byte b in result )
        hex = "0123456789ABCDEF"[ b ] + hex;

此代码也适用于任何数字系统(2 ^ n base),并对代码进行一些修改。

问题是我不理解算法的逻辑(for语句)。 有人可以解释这部分代码:

for ( int i = 0 ; i < result.Count ; i++ )
{
    int digit = result[i] * 10 + val;
    result[i] = (byte)( digit & 0x0F );
    val = digit >> 4;
}
if ( val != 0 )
    result.Add( (byte)val );

为了使这个代码转换为例如字符串十进制到字符串base64,我需要更改掩码,以便它可以计算六位,而不是十六进制系统,然后右移数字乘以6将剩余数字添加到下一个字节。

 result[i] = (byte)( digit & 0x03F );
 val = digit >> 6;  // 2^6 = 64

最后只需更改查找表即可打印结果

hex =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" [ b ] + hex;

for-loop中的这一行我不完全理解

int digit = result[i] * 10 + val;

这一行与循环一起,每次迭代到结果的每个字节都做什么?最重要的是,为什么?

1 个答案:

答案 0 :(得分:3)

如果将算法与可以在int中表示整数的更简单版本进行比较,则代码可能更容易理解。然后result将是一个32位整数,您将初始化为0,对于每个数字,您将result的现有值乘以10并添加下一个数字:

int result = 0;
foreach ( char c in s ) {
  int val = (int)( c - '0' );
  result = 10*result + val;
}

对于大整数,您需要一个字节数组来表示整数,并且您想要理解的循环是将未知长度的字节数组中的值乘以10而同时添加数字值的方法。因为乘以10不是一个简单的位移,你需要额外的代码。