这可以标记为已解决。问题出在打印宏。ESP_LOGx无法输出c++字符串。
我正在尝试在c++中将uin8_t数组转换为字符串。数组在头文件中定义,如下所示:
uint8_t mypayload[1112];打印数组本身是可行的,所以我确信它不是空的。
现在,我尝试将其转换为字符串:
string qrData;
std::string qrData(reinterpret_cast<char const*>(mypayload), sizeof mypayload);我也试过了:qrData = (char*)mypayload;
打印字符串会产生5个随机字符。
有没有人知道我哪里搞错了?
发布于 2020-03-28 15:57:56
到目前为止,唯一正确的评论来自某个程序员。所以所有的功劳都归他了。
来自Ian4264的评论是完全错误的。你当然可以做一个reinterpret_cast。
有关std::string的构造函数,请阅读here。您正在使用4号构造函数。描述如下:
4)使用s指向的字符串的第一个计数字符构造字符串。s可以包含空字符。字符串的长度是count。如果[s,s+count]不是有效范围,则行为未定义。
因此,即使字符串包含0个字符,也就是C风格的字符串-“终止符”,uint8_t数组的所有字节都将被复制。如果您打印字符串,那么它将打印所有字符,甚至是'\0‘后面没有可打印的字符。
也许你的“随机”角色。因为"terminator“后面的字符串很可能包含未初始化的值。
您应该考虑使用5号构造函数
5)使用由s指向的以空结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符决定。如果[s,s+特征::长度(S))不是有效范围,则行为未定义。
如果你需要添加字节,也是可以的。std::string可以动态增长。
顺便说一句:你定义了你的"std::string qrData“双精度,它不会被编译
发布于 2020-03-28 15:50:53
既然您知道另一个变量中的数据大小,为什么还要使用sizeof?它将提供数组的大小,而不是数据的大小。
假设代码中没有其他错误,这应该会给出正确的结果
std::string qrData(reinterpret_cast<char const*>(mypayload), data->payload_len);顺便说一下,在您引用的代码中,为什么qrData声明了两次?这看起来有点可疑。
发布于 2021-11-25 11:19:48
qrData = (const char*)mypayload;字符串仅接受常量char*。
https://stackoverflow.com/questions/60898360
复制相似问题