¿Cómo puedo convertir un número decimal grande a hexadecimal en C # (por ejemplo: 588063595292424954445828)

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

Pregunta

El número es mayor que int & amp; long pero puede acomodarse en Decimal . Pero los métodos normales ToString o Convert no funcionan en Decimal .

¿Fue útil?

Solución

Creo que esto producirá los resultados correctos cuando devuelva algo, pero puede rechazar enteros válidos. Sin embargo, me atrevo a decir que se puede solucionar con un poco de esfuerzo ... (Ah, y también fallará para los números negativos en este 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]);
}

Otros consejos

Tengo que estar de acuerdo con James, hacerlo manualmente, pero no use base-16. Use la base 2 ^ 32 e imprima 8 dígitos hexadecimales a la vez.

¿Supongo que una opción sería seguir quitándole trozos y convirtiendo trozos individuales? Un poco de mod / division, etc, convirtiendo fragmentos individuales ...

Entonces: ¿qué valor hexadecimal esperas?

Aquí hay dos enfoques ... uno usa la estructura binaria de decimal; uno lo hace manualmente. En realidad, es posible que desee hacerse una prueba: si bits [3] es cero, hágalo de la manera rápida, de lo contrario hágalo 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top