Comment puis-je convertir un grand nombre décimal en hexa en C # (ex: 588063595292424954445828)
-
03-07-2019 - |
Question
Le nombre est supérieur à int
& amp; long
mais peut être logé dans Decimal
. Mais les méthodes normales ToString
ou Convert
ne fonctionnent pas sur Decimal
.
La solution
Je pense que cela produira les bons résultats là où il retourne n'importe quoi, mais peut rejeter les entiers valides. J'ose dire que cela peut être résolu avec un peu d'effort cependant ... (Oh, et cela échouera également pour les nombres négatifs pour le moment.)
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]);
}
Autres conseils
Faites-le manuellement!
Je suis d'accord avec James - faites-le manuellement - mais n'utilisez pas de base 16. Utilisez la base 2 ^ 32 et imprimez 8 chiffres hexadécimaux à la fois.
Je suppose qu’une option serait de continuer à enlever des morceaux de celui-ci et à convertir des morceaux individuels? Un peu de mod / division, etc., en convertissant des fragments individuels ...
Alors: quelle valeur hexadécimale attendez-vous?
Voici deux approches ... L’une utilise la structure binaire décimale; on le fait manuellement. En réalité, vous voudrez peut-être faire un test: si bits [3] est égal à zéro, procédez rapidement, sinon faites-le manuellement.
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);