C#で大きな10進数を16進数に変換する方法(例:588063595292424954445828)

StackOverflow https://stackoverflow.com/questions/221154

質問

数値が int よりも大きい& long ですが、 Decimal に収容できます。ただし、通常の ToString または Convert メソッドは、 Decimal では機能しません。

役に立ちましたか?

解決

これは何かを返す場合には正しい結果を生成すると信じていますが、有効な整数を拒否するかもしれません。私はそれを少しの努力で回避できることを敢えて言います...(ああ、現時点では負の数でも失敗します。)

static string ConvertToHex(decimal d)
{
    int[] bits = decimal.GetBits(d);
    if (bits[3] != 0) // Sign and exponent
    {
        throw new ArgumentException();
    }
    return string.Format("{0:x8}{1:x8}{2:x8}",
        (uint)bits[2], (uint)bits[1], (uint)bits[0]);
}

他のヒント

手動で実行してください!

http://www.permadi.com/tutorial/numDecToHex/

Jamesに同意する必要があります-手動で行います-ただし、base-16は使用しないでください。基数2 ^ 32を使用し、一度に8桁の16進数を印刷します。

1つの選択肢は、チャンクを削除し続け、個々のチャンクを変換することでしょうか?少しのmod / divisionなど、個々のフラグメントを変換しています...

だから、あなたはどのような16進値を期待しますか?

次の2つのアプローチがあります。1つは10進数のバイナリ構造を使用します。手動で行います。実際には、テストが必要な場合があります。 if ビット[3]がゼロの場合、迅速に実行し、その他の場合手動で実行します。

    decimal d = 588063595292424954445828M;
    int[] bits = decimal.GetBits(d);
    if (bits[3] != 0) throw new InvalidOperationException("Only +ve integers supported!");
    string s = Convert.ToString(bits[2], 16).PadLeft(8,'0') // high
            + Convert.ToString(bits[1], 16).PadLeft(8, '0') // middle
            + Convert.ToString(bits[0], 16).PadLeft(8, '0'); // low
    Console.WriteLine(s);

    /* or Jon's much tidier: string.Format("{0:x8}{1:x8}{2:x8}",
            (uint)bits[2], (uint)bits[1], (uint)bits[0]);  */

    const decimal chunk = (decimal)(1 << 16);
    StringBuilder sb = new StringBuilder();
    while (d > 0)
    {
        int fragment = (int) (d % chunk);
        sb.Insert(0, Convert.ToString(fragment, 16).PadLeft(4, '0'));
        d -= fragment;
        d /= chunk;
    }
    Console.WriteLine(sb);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top