Wie kann ich eine große Dezimalzahl in C# in Hex konvertieren (z. B. 588063595292424954445828)
-
03-07-2019 - |
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
.
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
Mach es manuell!
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);