【问题标题】:std::string to char* without cutting bytesstd::string 到 char* 而不削减字节
【发布时间】:2019-08-02 02:47:33
【问题描述】:

所以,我使用 BLE 库从移动应用程序接收字节,我想将这些字节保存在 ESP32(“Arduino”)的 SD 卡中。

BLE 库正在接收这种格式的数据,作为std::string

std::string rxValue = pCharacteristic->getValue();

当我收到数据时,我正在做一个Serial.println(rxValue.length()) 来验证我收到的块的大小,我收到了 512 字节,正如预期的那样,它确实在打印 @987654325 @

所以,这里一切都好,我收到了我想要的 512 字节,问题来了

为了保存到 SD 卡,写入 SD 卡的函数要求我输入 char * message

所以我必须将std::string 转换为char *,我这样做如下:

const char *cstr = rxValue.c_str();

但是每当我这样做时,一些字节(我认为是字母数字/符号频谱之外的字节)被切断,将它们转换为 char 数组后长度不再是 512,我需要它们相同的 512 字节正确写入 SD 卡的所有字节。

为了测试这种行为,我打印了char * 的长度以查看 512 字节是否仍然存在:

strlen(cstr)

但是惊喜! 它们不是 512 字节,它们要少得多,所以当我尝试将 std::string 转换为 char * 时我做错了

在不丢失字节的情况下,将std::string 中的字节链转换为char * 的正确方法是什么:-(

提前谢谢你。

【问题讨论】:

  • std::string 可能包含 '\0' ,它不会被期望 C 字符串的函数正确处理。您需要使用不同的功能或从std::string 中删除'\0'。您修改std::string 或在使用c_str() 的结果之前让它死掉的另一个可能问题。请提供minimal reproducible example
  • 不要使用strlen 使用rxValue.size()
  • @Galik 在char * 中使用了``strlen()` 试图将size() 应用于char *,但它没有那个方法
  • 我不会使用cstr,而是使用rxValue.c_str()rxValue.size()
  • @Galik 谢谢,刚刚发布了我如何实现它的答案

标签: c++ arrays string arduino std


【解决方案1】:

一种可能的解释是,如果接收到的字符串以某种方式在接收到的 512 个字节的中间某处包含空终止符 \0,这就是为什么 strlen 会推断字符串长度小于 512。

我会在strlen 返回的索引处打印出 c_str 字符的值,看看它是否是一个空终止符。

【讨论】:

  • 512 个块来自 .bin 文件的流,我需要能够将 .bin 写入 SD 卡。基本上我在传输一个二进制文件,每个字节都很重要,如果它是一个空终止符,我相信它是 .bin 文件的一部分
  • 很难说如何修改您的 SD 写入逻辑而不了解它当前是如何完成的以及失败的地方。但本质上,您必须以某种方式处理意外的空终止符,直到您写入 rxValue.size() 返回的字节数,因为它是接收到的字节数的基本事实来源。
【解决方案2】:

没有什么是“切断”或以其他方式修改的。发生的情况是您使用了错误的函数strlen(),该函数旨在处理指向任意二进制数据的指针上的 C 样式字符串。

如上所述,strlen() 将返回 文本字符串 的长度,该长度以您的数据中遇到的第一个 '\0' 字符结尾。但这并不意味着数据不存在。

当调用一些写入数据的函数时,你需要做的是将rxValue.data()作为指针传递(你也可以使用rxValue.c_str(),但是使用data()可以清楚地表明你期望这里有一些“数据” , 而不是 "string") 和 rxValue.size() 作为大小。

【讨论】:

    【解决方案3】:

    我做到了!

    我最终做了以下事情:

    unsigned char cstr[rxValue.size()];
    memcpy(cstr, rxValue.data(), rxValue.size());
    

    这就是它完美运作的方式。感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-13
      • 2016-06-03
      • 2011-10-26
      • 2017-08-22
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多