¿Cómo puedo convertir un número decimal grande a hexadecimal en C # (por ejemplo: 588063595292424954445828)
-
03-07-2019 - |
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
.
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
¡Hazlo manualmente!
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);