大きな数値 (文字列形式) を任意の数値システムに変換するクラスを C# で作成しようとしています。このコードは、gi-normous 整数 (文字列形式) を 16 進数形式に変換する方法で見つかりましたか? (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 );
たとえば、このコードを文字列 10 進数から文字列 base64 に変換するようにするには、マスクを変更して、16 進数システムの 4 ビットではなく 6 ビットを計算できるようにし、数字を 6 だけ右シフトする必要があります。残りを次のバイトに追加します。
result[i] = (byte)( digit & 0x03F );
val = digit >> 6; // 2^6 = 64
最後にルックアップテーブルを変更して結果を出力します
hex =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" [ b ] + hex;
私が完全に理解していないのは、forループのこの行です
int digit = result[i] * 10 + val;
この行とループは、結果の各バイトに対する各反復で何を行っているのでしょうか? そして最も重要なことは、なぜですか?