从无符号字符到 std::string 的 C++ 转换 [重复]

Posted

技术标签:

【中文标题】从无符号字符到 std::string 的 C++ 转换 [重复]【英文标题】:C++ conversion from unsigned char to std::string [duplicate] 【发布时间】:2017-12-06 09:30:45 【问题描述】:

简介:考虑到我没有使用 C++ 的经验,但可以找到任何语言来完成基本任务。 我的大部分经验是使用 .net 语言(vn.net 和 C#)、php 和 js,所以请像在教一个完整的菜鸟一样解释。

问题出在:我收到的数据是无符号字符[12];然后我必须将该数据附加到 std::string

数据总是 12 个字符长,并且不是以空结尾的,因为它是通过选择从串行端口接收的特定字节来收集的。

长话短说:

std::string stroutput = "some text ";
unsigned char characters[12];
characters[0]=64; //demo data to shorten the code
characters[1]=72;
stroutput.append(characters[0]);
stroutput.append(characters[1]);
....

我想要的结果是字符串值

some text @H...

但我得到的是编译时出错

error: invalid conversion from ‘unsigned char’ to ‘const char*’ [-fpermissive]
stroutput.append(characters[0]);
                 ~~~~~~~~~~~~^

这种想法背后的逻辑是:

printf("%c%c",characters[0],characters[1]);

std::cout << characters[0] << characters[0] << std::endl;

结果

@H

那么:如何将 unsigned char something[12] 转换为 std::string?

谢谢

编辑:抱歉重复,搜索未返回该问题。 谢谢大家 - 太糟糕了,我无法标记多个答案!

【问题讨论】:

stroutput.append(reinterpret_cast(characters), 12); 【参考方案1】:

要追加一个字符,你必须使用下面的重载方法 append

basic_string& append(size_type n, charT c);

例如

stroutput.append(1, characters[0]);
stroutput.append(1, characters[1]);

否则使用方法push_backoperator +=。例如

stroutput += characters[0];
stroutput += characters[1];

如果你想追加整个数组或它的一部分,那么你可以写

stroutput.append( reinterpret_cast<char *>( characters ), sizeof( characters ) );

stroutput.append( reinterpret_cast<char *>( characters ), n );

其中 n 是要追加的数组的字符数。

【讨论】:

【参考方案2】:

std::string 有 a constructorr 需要两个迭代器:

stroutput += std::string(characters, characters + 12);

【讨论】:

这应该是正确的答案,特别是如果缓冲区被声明为unsigned char characters[12];【参考方案3】:

您几乎拥有它,只需使用string::push_back 而不是string::append - append 用于连接strings,而push_back 用于添加字符(并处理调整内部大小等)。

使用string constructor 通常是更好的选择,但这里可能会导致问题,因为您的数组不是以空值结尾的(请参阅here)。

编辑:实际上,上面链接中的构造函数 5 (from-sequence) 应该是合适的(如果您愿意从unsigned char * 转换为const char *,根据this question+answer 是安全的):

std::string stroutput(reinterpret_cast<const char *>(characters), 12);

【讨论】:

std::string stroutput(characters, 12); 不会编译因为characters 因为unsigned char 每种方法都有效,可惜我不能标记多个答案。【参考方案4】:

在 C++98 中,std::string::append 方法被这些参数重载:

(1) string& append (const string& str);
(2) string& append (const string& str, size_t subpos, size_t sublen);
(3) string& append (const char* s);
(4) string& append (const char* s, size_t n);
(5) string& append (size_t n, char c);
(6) template <class InputIterator> string& append (InputIterator first, InputIterator last);

并且在 C++11 和 C++14 中,它也被string&amp; append (initializer_list&lt;char&gt; il);重载。

如您所见,string&amp; append(unsigned char) 没有候选人。该错误可能来自编译器在重载解析中失败,尝试使用用于以 null 结尾的字符串参数的 (3),但找不到为 unsigned char -&gt; const char * 定义的转换。

如果您仍想使用std::string::append 方法,您可以使用(5)string&amp; append (size_t n, char c),它将在您的字符串后面附加cn 次。在您的情况下,它将是:

stroutput.append(1, characters[0]);
stroutput.append(1, characters[1]);

unsgined char 将被转换为 char

另一种选择是将此constructor 用于std::string

std::string(characters, characters + 12);

【讨论】:

以上是关于从无符号字符到 std::string 的 C++ 转换 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

opencv c++:将图像矩阵从无符号字符转换为浮点数

将 std::string 转换为无符号字符数组

与静态库中的 std::string 相关的 C++ 未定义符号

在 C++ 中定义 std::string 没有转义字符

如何将字符串保存到 C++ 中类的 string* 成员?

如何在 C++ 中将 char 指针附加到 std::string