كيف يمكنني تحويل رقم عشري كبير إلى Hex في C# (على سبيل المثال: 58806359529242495445828)
-
03-07-2019 - |
سؤال
الرقم أكبر من int
& long
ولكن يمكن استيعابها في Decimal
. لكن الطبيعي ToString
أو Convert
الأساليب لا تعمل عليها Decimal
.
المحلول
أعتقد أن هذا سيؤدي إلى النتائج الصحيحة حيث تُرجع أي شيء ، ولكن قد يرفض الأعداد الصحيحة الصالحة. أجرؤ على القول إنه يمكن العمل مع القليل من الجهد على الرغم من ... (أوه ، وسوف يفشل أيضًا في الأرقام السلبية في الوقت الحالي.)
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]);
}
نصائح أخرى
افعلها يدويًا!
يجب أن أتفق مع جيمس - افعل ذلك يدويًا - لكن لا تستخدم Base -16. استخدم قاعدة 2^32 ، وطباعة 8 أرقام سداسية في وقت واحد.
أعتقد أن خيار واحد هو الاستمرار في خلع القطع ، وتحويل القطع الفردية؟ قليلا من وزارة الدفاع/التقسيم وما إلى ذلك ، تحويل شظايا فردية ...
إذن: ما هي القيمة السداسية التي تتوقعها؟
فيما يلي نهجان ... يستخدم المرء التركيب الثنائي للعشري. واحد يفعل يدويا. في الواقع ، قد ترغب في إجراء اختبار: إذا البتات [3] صفر ، افعل ذلك بالطريقة السريعة ، خلاف ذلك افعلها يدويًا.
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);