كيف يمكنني تحويل رقم عشري كبير إلى Hex في C# (على سبيل المثال: 58806359529242495445828)

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

سؤال

الرقم أكبر من 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top