Полагаю, одним из вариантов было бы продолжать снимать с него куски и преобразовывать отдельные куски? Немного мод / деление и т. Д., Конвертирование отдельных фрагментов ...
Итак: какое шестнадцатеричное значение вы ожидаете?
Вот два подхода ... один использует двоичную структуру десятичной дроби; каждый делает это вручную. В действительности вам может потребоваться выполнить тест: , если бит [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);