因此,我正在使用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 *
而又不丢失字节的正确方法是什么:-(
谢谢。
答案 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());
这就是它完美运行的方式。谢谢大家的帮助。