【发布时间】: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