繁体   English   中英

Arduino:将 uint64_t 转换为字符串

[英]Arduino: Converting uint64_t to string

我有一个能够转换为 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 包含时遇到问题:当我 go 到我的项目属性 > 配置属性 > C/C++ > 常规 > 附加包含目录并添加到路径“C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\" Visual Studio 将其删除。

非常感谢任何输入。

假设你想在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

只是添加到可能的解决方案列表中。 我使用以下功能:

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

这就像@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;
}

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

对于那些遇到同样问题的人:我做了一个解决方法,我只是逐个浏览数字并使它们成为一个字符。 这对我帮助:我如何迭代C中3位数的每个数字?

为此,我创建了一个名为Int64String的简单库。 它非常快(从版本1.1.0开始),并且支持从2到16的任何“基础”。它可以在任何接受String类型的地方使用:

// 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中找到

任何数字,不管它有多长,都存储在一堆彼此靠近的字节中。 因此,您希望将字节数组转换为它们的hex string表示形式。

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"

注意这仅适用于positive

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM