Como posso converter um grande número decimal em hexadecimal em C# (por exemplo: 5880635952924249544445828)
-
03-07-2019 - |
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
.
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
Faça isso manualmente!
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);