如何在C#中将大十进制数转换为十六进制(例如: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]);
}

其他提示

我必须同意詹姆斯 - 手动做 - 但不要使用base-16。使用base 2 ^ 32,一次打印8个十六进制数字。

我想一个选择是继续取消它,并转换单个块?一些mod / division等,转换单个片段...

那么:你期望什么十六进制值?

这里有两种方法......一种是使用十进制的二进制结构;一个人手动完成。实际上,您可能希望进行测试:如果位[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