1

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

4

4 に答える 4

2

手動でやってください!

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

于 2008-10-21T08:29:40.803 に答える
2

これにより、何かを返す正しい結果が得られると思いますが、有効な整数を拒否する可能性があります。少し努力すれば回避できると思います...(ああ、今のところ負の数でも失敗します。)

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]);
}
于 2008-10-21T08:55:20.160 に答える
1

私はジェームズに同意する必要があります-手動で行います-しかし、base-16は使用しないでください. 基数 2^32 を使用し、一度に 8 桁の 16 進数を出力します。

于 2008-10-21T08:33:22.873 に答える
1

1つのオプションは、チャンクを取り続けて、個々のチャンクを変換することだと思いますか? mod/division などのビット、個々のフラグメントの変換...

では、どのような 16 進値が期待されますか?

ここに 2 つのアプローチがあります... 1 つは 10 進数のバイナリ構造を使用します。手動で行います。実際には、テストが必要になる場合があります。bits [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);
于 2008-10-21T08:39:45.277 に答える