Comment puis-je convertir un grand nombre décimal en hexa en C # (ex: 588063595292424954445828)

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

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 .

Était-ce utile?

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

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top