Skip to main content
1 of 3

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