我正在尝试用 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 基数),只需对代码进行一些修改。
问题是我不理解算法的逻辑(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循环中的这一行
int digit = result[i] * 10 + val;
这条线以及循环在每次迭代时对结果的每个字节做了什么?最重要的是,为什么?