2

大きな数値 (文字列形式) を任意の数値システムに変換するクラスを 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;

この行とループは、結果の各バイトに対する各反復で何を行っているのでしょうか? そして最も重要なことは、なぜですか?

4

1 に答える 1

3

このアルゴリズムを、整数をint. 次にresult、0に初期化する32ビット整数になり、各桁に対して、既存の値にresult10を掛けて次の桁を追加します。

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

大きな整数の場合、整数を表すバイト配列が必要です。理解したいループは、長さが不明なバイト配列の値を 10 で乗算すると同時に、数字の値を加算する方法です。10 の乗算は単純なビット シフトではないため、追加のコードが必要です。

于 2013-08-02T08:52:17.830 に答える