2013-08-02 50 views
2

我试着写在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 = "ABCDEF"[ 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 = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" [ b ] + hex; 

正是这条线在for循环的一个,我不完全理解

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

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

+1

排序计算出来的。假设字符串只是'8'。然后数字= 8,结果[i] = 8,val = 0,不添加字节=> 8(1字节)。下一个字符是4;数字是84,结果[0]是5,val是4 => 54(2字节)。 – Jiminion

+0

54十六进制是十进制84。 – Jiminion

+1

欢迎来到[so]。我投了赞成票,为什么低估了人们?以及为什么离题,关于“软件算法”的问题? –

回答

3

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

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

对于大整数你需要一个字节数组代表整数,要理解的是循环乘以未知长度的字节数组中的值与10同时还加入数字值的一种方法。因为乘以10不是简单的位移,所以需要额外的代码。