5

I have a binary that I was able to convert to a uint64_t. It's big, so I really needed a uint64_t. I'm having trouble converting it to a char array. I can do it in a standalone project but not on Arduino

Some roadblocks that I encountered:

  • I can't use sprintf ("%llu"): It's giving me a result of 0 and further googling shows that it wasn't really implemented
  • I can't use itoa: Yes, itoa was working for smaller numbers, but i'm dealing with a uint64_t and it seems like it reached its limit and giving me a negative result
  • I can't use String(123456789): I can use it for other types like int and long, but I can't pass in a uint64_t because it's not supported in the parameters
  • I can't use long long: Searching for it only gives me a variation on uint64_t (eg. use sprintf)
  • I'm having trouble using VC include in Visual Studio: When i go to my Project Properties > Configuration Properties > C/C++ > General > Additional Include Drectories and add in the path "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\" Visual Studio deletes it.

Any input is greatly appreciated.

Dinal24
  • 3,162
  • 2
  • 18
  • 32
John
  • 77
  • 1
  • 1
  • 5

6 Answers6

6

Assuming you want to print "number" in HEX:

  uint64_t number;
  unsigned long long1 = (unsigned long)((number & 0xFFFF0000) >> 16 );
  unsigned long long2 = (unsigned long)((number & 0x0000FFFF));

  String hex = String(long1, HEX) + String(long2, HEX); // six octets
Amir Samakar
  • 505
  • 5
  • 13
6

This is like the sequel to the answer by @john.

I use the following function:

String uint64ToString(uint64_t input) {
  String result = "";
  uint8_t base = 10;

  do {
    char c = input % base;
    input /= base;

    if (c < 10)
      c +='0';
    else
      c += 'A' - 10;
    result = c + result;
  } while (input);
  return result;
}

Source: https://github.com/markszabo/IRremoteESP8266/blob/master/src/IRutils.cpp#L66

Marcel Stör
  • 22,695
  • 19
  • 92
  • 198
6

Just to add onto the list of possible solutions. I use the following function:

char *uint64_to_string(uint64_t input)
{
    static char result[21] = "";
    // Clear result from any leftover digits from previous function call.
    memset(&result[0], 0, sizeof(result));
    // temp is used as a temporary result storage to prevent sprintf bugs.
    char temp[21] = "";
    char c;
    uint8_t base = 10;

    while (input) 
    {
        int num = input % base;
        input /= base;
        c = '0' + num;

        sprintf(temp, "%c%s", c, result);
        strcpy(result, temp);
    } 
    return result;
}
Kai Chen
  • 61
  • 1
  • 3
1

I've created a simple library called Int64String for this purpose. It is very fast (from version 1.1.0), and supports any "base" from 2 to 16. It can be used anywhere that accepts a String type:

// LL and ULL suffixes allow the compiler to use the right type
Serial.println(int64String((int64_t)-9223372036854775808LL)); // cast required here for some reason
Serial.println(int64String(4527492349271ULL, 16));

Would output:

-9223372036854775808
41E2392BD57

It can be found in the Library Manager or at https://github.com/djGrrr/Int64String

djGrrr
  • 11
  • 2
0

To those who are having the same problem: I did a workaround where I just went through the digits one by one and making them a char. This helped me: How can I iterate through each digit in a 3 digit number in C?

Community
  • 1
  • 1
John
  • 77
  • 1
  • 1
  • 5
0

any number, no matter how long it is, is stored with a bunch of bytes near each other. so effectively you want to convert an array of bytes into hex string representation of them.

char* numberToHexStr(char* out, unsigned char* in, size_t length)
{
        char* ptr = out;
        for (int i = length-1; i >= 0 ; i--)
            ptr += sprintf(ptr, "%02X", in[i]);
        return ptr;
}

usage

unsigned long long superlong = 0xF1F2F3F4F5F6F7F8; // 8 bytes
char str[32];
numberToHexStr(str, (unsigned char*) &superlong, sizeof(superlong));
printf("superlong = %s", str);
// outputs "superlong = F1F2F3F4F5F6F7F8"

NOTE this only works for positive numbers

Ali80
  • 6,333
  • 2
  • 43
  • 33