C ++从unsigned char转换为std :: string

时间:2017-12-06 09:30:46

标签: c++ string type-conversion unsigned-char

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

问题在于:我以unsigned char字符接收数据[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 [12]转换为std :: string?

由于

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

4 个答案:

答案 0 :(得分:1)

要附加一个字符,您必须使用以下重载方法追加

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是要追加的数组的字符数。

答案 1 :(得分:0)

你几乎拥有它,只需使用string::push_back代替string::append - append用于连接string s,而push_back用于添加字符(和处理内部调整等问题。)

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

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

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

答案 2 :(得分:0)

std::stringa constructor r,需要两个迭代器:

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

答案 3 :(得分:0)

在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& append (initializer_list<char> il);重载。

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

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

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

unsgined char将转换为char

另一种方法是将此constructor用于std::string

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