std::字符串到字符*而不切割字节

std::string to char* without cutting bytes

本文关键字:字节 字符串 字符 std      更新时间:2023-10-16

所以,我正在使用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();

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

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

strlen(cstr)

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

std::string传入的字节链转换为char *而不丢失字节的正确方法是什么:-(

提前谢谢你。

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

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

我做到了!

我最终做了以下事情:

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

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

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

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

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