我试着写在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;
这是什么线,与环一起,做每个迭代结果的每个字节?最重要的是,为什么?
排序计算出来的。假设字符串只是'8'。然后数字= 8,结果[i] = 8,val = 0,不添加字节=> 8(1字节)。下一个字符是4;数字是84,结果[0]是5,val是4 => 54(2字节)。 – Jiminion
54十六进制是十进制84。 – Jiminion
欢迎来到[so]。我投了赞成票,为什么低估了人们?以及为什么离题,关于“软件算法”的问题? –