std :: string转换为char *,而不减少字节

时间:2019-08-02 02:47:33

标签: c++ arrays string arduino std

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

BLE库正在以std::string

的格式接收数据。
std::string rxValue = pCharacteristic->getValue();

当我收到数据时,我正在做Serial.println(rxValue.length())来验证我收到的块的大小,我收到的是预期的 512字节,并且确实在打印512

所以,这一切都很好,我收到了我想要的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 *而又不丢失字节的正确方法是什么:-(

谢谢。

3 个答案:

答案 0 :(得分:2)

一个可能的解释是,如果接收到的字符串某种程度上在接收到的512字节中间的某个位置包含空终止符\0,这就是strlen会推断出字符串长度小于512的原因

我将在strlen返回的索引处打印c_str字符的值,并查看它是否为空终止符。

答案 1 :(得分:0)

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

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

调用某些写数据的函数时,您需要做的就是传递rxValue.data()作为指针(您也可以使用rxValue.c_str(),但是使用data()可以清楚地表明您在这里需要一些“数据”,而不是“字符串”)和rxValue.size()作为大小。

答案 2 :(得分:0)

我做到了!

我最终做了以下事情:

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

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