12

「大きな」16 進数を変換する方法 (文字列形式):

EC851A69B8ACD843164E10CFF70CF9E86DC2FEE3CF6F374B43C854E3342A2F1AC3E30C741CC41E679DF6D07CE6FA3A66083EC9B8C8BF3AF05D8BDBB0AA6CB3EF8C5BAA2A5E531BA9E28592F99E0FE4F95169A6C63F635D0197E325C5EC76219B907E4EBDCD401FB1986E4E3CA661FF73E7E2B8FD9988E753B7042B2BBCA76679

10 進数 (文字列形式):

166089946137986168535368849184301740204613753693156360462575217560130904921953976324839782808018277000296027060873747803291797869684516494894741699267674246881622658654267131250470956587908385447044319923040838072975636163137212887824248575510341104029461758594855159174329892125993844566497176102668262139513

クラスを使用せずにBigInteger(私のアプリケーションは .NET Framework 4 のないマシンをサポートする必要があるため)?

4

8 に答える 8

16

これは、任意に大きな数を処理できる簡単な実装です。この実装の目的は単純さであり、パフォーマンスではありません。したがって、実稼働シナリオで使用する場合は、大幅に最適化する必要があります。

編集:Dan Byströmの10進数から16進数への逆変換の実装ごとにさらに簡略化

static string HexToDecimal(string hex)
{
    List<int> dec = new List<int> { 0 };   // decimal result

    foreach (char c in hex)
    {
        int carry = Convert.ToInt32(c.ToString(), 16);   
            // initially holds decimal value of current hex digit;
            // subsequently holds carry-over for multiplication

        for (int i = 0; i < dec.Count; ++i)
        {
            int val = dec[i] * 16 + carry;
            dec[i] = val % 10;
            carry = val / 10;
        }

        while (carry > 0)
        {
            dec.Add(carry % 10);
            carry /= 10;
        }
    }

    var chars = dec.Select(d => (char)('0' + d));
    var cArr = chars.Reverse().ToArray();
    return new string(cArr);
}
于 2013-06-06T16:24:24.447 に答える
0

.Net 2.0 以降で動作するはずのIntXライブラリを使用できます。に関するページの説明からBigInteger

したがって、内部的に System.Numerics.BigInteger は標準の任意の算術アルゴリズムを使用しているようで、IntX ライブラリについて心配する必要はありません。FHT を使用しているため、実際に大きな整数の場合は数倍高速になる可能性があるためです。

ライセンスはかなり自由ですが、問題がないことを確認するために最初に読む価値があります。

私はこのライブラリを使用していませんが、ソースコードをざっと見ただけで、これで十分です。

string dec = new IntX(myHex, 16).ToString();

自分でコードをコンパイルしたくない場合は、Nuget 経由でインストールできます。

于 2013-06-06T16:49:22.830 に答える
0

Douglas のコードを PHP に翻訳したところです。

function BigNumberHexToDecimal($hex)
{
    $dec = array(0);
    $hexLen = strlen($hex);
    for($h=0;$h<$hexLen;++$h)
    {
        $carry = hexdec($hex[$h]);
        for ($i = 0; $i < count($dec); ++$i)
        {
            $val = $dec[$i] * 16 + $carry;
            $dec[$i] = $val % 10;
            $carry = (int)($val / 10);
        }
        while ($carry > 0)
        {
            $dec[] = $carry % 10;
            $carry = (int)($carry / 10);
        }
    }

    return join("", array_reverse($dec));
}
于 2014-03-03T10:59:22.383 に答える
0

Douglas コードを Java に翻訳したところです。

public static String HexToDec(String hex) {
    List<Integer> dec = new ArrayList<Integer>();

    for (int k = 0; k < hex.length(); k++) {
        String c = hex.charAt(k) + "";
        int carry = Integer.parseInt(c, 16);

        for (int i = 0; i < dec.size(); ++i) {
            int val = dec.get(i) * 16 + carry;
            dec.set(i, val % 10);
            carry = val / 10;
        }

        while (carry > 0) {
            dec.add(carry % 10);
            carry /= 10;
        }
    }

    int[] out = new int[dec.size()];
    for (int i = 0; i < dec.size(); i++) {
        out[i] = dec.get(i).intValue();
    }

    return arrayToDecString(reverseArray(out));

}

public static String arrayToDecString(int[] data) {

    String str = "";
    for (int i = 0; i < data.length; i++) {
        str += data[i] + "";
    }
    return str;
}

public static int[] reverseArray(int[] data) {
    for (int i = 0; i < data.length / 2; i++) {
        int temp = data[i];
        data[i] = data[data.length - i - 1];
        data[data.length - i - 1] = temp;
    }
    return data;
}
于 2016-08-01T09:38:30.257 に答える