Arduino:将uint64_t转换为字符串

Joh*_*ohn 4 c++ arduino arduino-uno

我有一个二进制文件,我能够转换为uint64_t.它很大,所以我真的需要一个uint64_t.我将它转换为char数组时遇到了麻烦.我可以在独立项目中完成,但不能在Arduino上完成

我遇到的一些障碍:

  • 我不能使用sprintf("%llu"):它给我0的结果,进一步的谷歌搜索显示它没有真正实现
  • 我不能使用itoa:是的,itoa正在为较小的数字工作,但我正在处理uint64_t,它似乎已达到极限并给我一个负面结果
  • 我不能使用String(123456789):我可以将它用于其他类型,如int和long,但我无法传入uint64_t,因为参数不支持
  • 我不能长时间使用:搜索它只会给我一个关于uint64_t的变化(例如使用sprintf)
  • 我在Visual Studio中使用VC include时遇到问题:当我转到我的 项目属性>配置属性> C/C++>常规>其他包含Drector并添加路径"C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\include \" Visual Studio删除它.

任何输入都非常感谢.

Ami*_*kar 6

假设你想在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
Run Code Online (Sandbox Code Playgroud)


Mar*_*tör 6

这就像@john 的答案的续集。

我使用以下函数:

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;
}
Run Code Online (Sandbox Code Playgroud)

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


小智 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;
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 1

对于那些遇到同样问题的人:我做了一个解决方法,我只是一个接一个地遍历数字并将它们变成一个字符。这对我有帮助:如何在 C 中迭代 3 位数字中的每个数字?