Home > Blockchain >  How to convert an arbitrary length unsigned int array to a base 10 string representation?
How to convert an arbitrary length unsigned int array to a base 10 string representation?

Time:06-06

I am currently working on an arbitrary size integer library for learning purposes.

Each number is represented as uint32_t *number_segments.

I have functional arithmetic operations, and the ability to print the raw bits of my number.

However, I have struggled to find any information on how I could convert my arbitrarily long array of uint32 into the correct, and also arbitrarily long base 10 representation as a string.

Essentially I need a function along the lines of:

std::string uint32_array_to_string(uint32_t *n, size_t n_length);

Any pointers in the right direction would be greatly appreciated, thank you.

CodePudding user response:

You do it the same way as you do with a single uint64_t except on a larger scale (bringing this into modern c is left for the reader):

char * to_str(uint64_t x) {
    static char buf[23] = {0}; // leave space for a minus sign added by the caller
    char *p = &buf[22];
    do {
      *--p = '0'   (x % 10);
      x /= 10;
    } while(x > 0);
    return p;
}

The function fills a buffer from the end with the lowest digits and divides the number by 10 in each step and then returns a pointer to the first digit.

Now with big nums you can't use a static buffer but have to adjust the buffer size to the size of your number. You probably want to return a std::string and creating the number in reverse and then copying it into a result string is the way to go. You also have to deal with negative numbers.

Since a long division of a big number is expensive you probably don't want to divide by 10 in the loop. Rather divide by 1'000'000'000 and convert the remainder into 9 digits. This should be the largest power of 10 you can do long division by a single integer, not bigum / bignum. Might be you can only do 10'000 if you don't use uint64_t in the division.

  • Related