Как я могу преобразовать большое десятичное число в шестнадцатеричное в C # (например, 588063595292424954445828) - PullRequest
1 голос
/ 21 октября 2008

Номер больше int & long, но может быть размещен в Decimal. Но обычные ToString или Convert методы не работают на Decimal.

Ответы [ 4 ]

2 голосов
/ 21 октября 2008

Я полагаю, что это даст правильные результаты, когда оно возвращает что угодно, но может отклонить действительные целые числа. Я смею сказать, что это можно обойти с небольшим усилием, хотя ... (О, и это также потерпит неудачу для отрицательных чисел в настоящее время.)

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]);
}
2 голосов
/ 21 октября 2008

Сделай это вручную!

http://www.permadi.com/tutorial/numDecToHex/

1 голос
/ 21 октября 2008

Полагаю, одним из вариантов было бы продолжать снимать с него куски и преобразовывать отдельные куски? Немного мод / деление и т. Д., Конвертирование отдельных фрагментов ...

Итак: какое шестнадцатеричное значение вы ожидаете?

Вот два подхода ... один использует двоичную структуру десятичной дроби; каждый делает это вручную. В действительности вам может потребоваться выполнить тест: , если бит [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);
1 голос
/ 21 октября 2008

Я должен согласиться с Джеймсом - сделать это вручную - но не использовать base-16. Используйте базу 2 ^ 32 и печатайте 8 шестнадцатеричных цифр за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...