首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中将uint8_t数组转换为字符串

在c++中将uint8_t数组转换为字符串
EN

Stack Overflow用户
提问于 2020-03-28 15:20:35
回答 3查看 1.1K关注 0票数 1

这可以标记为已解决。问题出在打印宏。ESP_LOGx无法输出c++字符串。

我正在尝试在c++中将uin8_t数组转换为字符串。数组在头文件中定义,如下所示:

代码语言:javascript
复制
uint8_t mypayload[1112];

打印数组本身是可行的,所以我确信它不是空的。

现在,我尝试将其转换为字符串:

代码语言:javascript
复制
string qrData; 
std::string qrData(reinterpret_cast<char const*>(mypayload), sizeof mypayload);

我也试过了:qrData = (char*)mypayload;

打印字符串会产生5个随机字符。

有没有人知道我哪里搞错了?

EN

回答 3

Stack Overflow用户

发布于 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“双精度,它不会被编译

票数 2
EN

Stack Overflow用户

发布于 2020-03-28 15:50:53

既然您知道另一个变量中的数据大小,为什么还要使用sizeof?它将提供数组的大小,而不是数据的大小。

假设代码中没有其他错误,这应该会给出正确的结果

代码语言:javascript
复制
std::string qrData(reinterpret_cast<char const*>(mypayload), data->payload_len);

顺便说一下,在您引用的代码中,为什么qrData声明了两次?这看起来有点可疑。

票数 0
EN

Stack Overflow用户

发布于 2021-11-25 11:19:48

代码语言:javascript
复制
qrData = (const char*)mypayload;

字符串仅接受常量char*。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60898360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档