I have come up with following preliminary version. This will need more testing but it works for the example case found in https://en.bitcoin.it/wiki/Difficulty.
void hexdump(unsigned char *data, int len)
{
int c = 0;
while (c < len)
{
cout << hex << std::setw(2) << std::setfill('0') << static_cast<int>(data[c++]);
}
printf("\n");
}
bool convert_bits(uint32_t bits, uint64_t* value, int val_len = 4)
{
assert(val_len == 4);
assert(value != NULL);
if (val_len != 4 || value == NULL)
{
return false;
}
auto x = 8 * ((bits >> 24) - 3);
auto val = bits & 0x00FFFFFF;
value[4 - (x / 64) - 1] = htobe64(val << (x % 64));
return true;
}
int main()
{
uint64_t num[4] = { 0, 0, 0, 0 };
if(convert_bits(0x1b0404cb, num))
{
hexdump((unsigned char *)num, sizeof(uint64_t) * 4);
}
return 0;
}
This prints: 00000000000404cb000000000000000000000000000000000000000000000000