Wie kann ich eine große Dezimalzahl in C# in Hex konvertieren (z. B. 588063595292424954445828)

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

Frage

Die Zahl ist größer als int & long kann aber in Anerkennung sein in Decimal. Aber der Normale ToString oder Convert Methoden arbeiten nicht an Decimal.

War es hilfreich?

Lösung

Ich glaube, dies wird die richtigen Ergebnisse erzielen, bei denen es etwas zurückgibt, aber möglicherweise gültige ganze Zahlen ablehnen. Ich wage zu sagen, dass das mit ein wenig Aufwand bearbeitet werden kann ... (oh, und es wird im Moment auch für negative Zahlen scheitern.)

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]);
}

Andere Tipps

Ich muss James zustimmen - es manuell tun - aber benutze Base -16 nicht. Verwenden Sie die Basis 2^32 und drucken Sie jeweils 8 Sechskantstellen.

Ich denke, eine Option wäre, immer wieder die Blechzählungen abzunehmen und einzelne Stücke zu konvertieren? Ein bisschen Mod/Division usw., konvertieren einzelne Fragmente ...

Also: Welchen Hex -Wert erwarten Sie?

Hier sind zwei Ansätze ... man verwendet die binäre Struktur der Dezimalzahl; Einer macht es manuell. In Wirklichkeit möchten Sie vielleicht einen Test haben: wenn Bits [3] ist Null, mach es schnell, Andernfalls mach es manuell.

    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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top