Arduino: 将uint64_t转换为字符串

5
我有一个二进制文件,已经成功转换成了 uint64_t 类型。它很大,所以我确实需要 uint64_t 类型。但是我在将其转换为 char 数组时遇到了问题。虽然在独立的项目中可以做到,但在 Arduino 上无法做到。
我遇到了一些障碍:
  • 我无法使用 sprintf("%llu"):它会给我返回0的结果,并且进一步的搜索显示它并没有真正实现。
  • 我无法使用 itoa:是的,itoa 对于较小的数字有效,但我处理的是 uint64_t 类型,而且貌似已经达到了极限并给我返回了负数结果。
  • 我无法使用 String(123456789):我可以用它来处理其他类型如 int 和 long,但我无法传入 uint64_t,因为它不支持这个参数。
  • 我无法使用 long long:搜索它只会给我一种变体 uint64_t 的方法(例如使用 sprintf)。
  • 我在使用 Visual Studio 中的 VC include 时遇到了麻烦:当我进入 Project Properties > Configuration Properties > C/C++ > General > Additional Include Drectories 并添加路径 "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\" 时,Visual Studio 会将其删除。
非常感谢您的任何建议。
6个回答

6

6

除了可能的解决方案列表外,我使用以下函数:

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;
}

6
假设您想以十六进制打印“number”:
  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

1
我认为他们想要十进制,因为这是“%llu”返回的内容。 - phi1010

1
我已经为此创建了一个简单的库,名为Int64String。它非常快速(从版本1.1.0开始),并支持任何2到16进制的"基数"。它可以在任何接受字符串类型的地方使用:
// 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));

将会输出:

-9223372036854775808
41E2392BD57

它可以在库管理器中找到,或者在https://github.com/djGrrr/Int64String上找到。

0

嘿,你能详细说明一下你是怎么做到的吗?我试着按照你链接的另一篇帖子去做,但对我没有太大帮助。谢谢! - JackKalish
1
请务必提供完整的答案,而不是链接,正如社区准则所建议的那样。谢谢。 - Guilherme Mussi

0

不论多长的数字,都是存储在一堆相邻的字节中。因此,您要将一组字节转换为它们的十六进制字符串表示。

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;
}

用法

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

注意,这仅适用于正数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接