Como posso converter um grande número decimal em hexadecimal em C# (por exemplo: 5880635952924249544445828)

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

Pergunta

O número é maior do que int & long mas pode ser acomodado em Decimal. Mas o normal ToString ou Convert Métodos não funcionam em Decimal.

Foi útil?

Solução

Acredito que isso produzirá os resultados certos onde retornará qualquer coisa, mas pode rejeitar números inteiros válidos. Eu ouso dizer que isso pode ser contornado com um pouco de esforço ... (ah, e também falhará para números negativos no momento.)

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]);
}

Outras dicas

Eu tenho que concordar com James - faça isso manualmente - mas não use a Base -16. Use a base 2^32 e imprima 8 dígitos hexadecimais por vez.

Eu acho que uma opção seria continuar tirando pedaços dela e convertendo pedaços individuais? Um pouco de mod/divisão etc, convertendo fragmentos individuais ...

Então: qual valor hexadecimal você espera?

Aqui estão duas abordagens ... Um usa a estrutura binária de decimal; um faz isso manualmente. Na realidade, você pode querer fazer um teste: E se bits [3] é zero, faça da maneira rápida, por outro lado faça isso manualmente.

    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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top