从 unsigned char 到 std::string 的 C++ 转换
C++ conversion from unsigned char to std::string
简介:考虑到我没有使用 C++ 的经验,但可以找到使用任何语言来完成基本任务的方法。
我的大部分经验是使用 .net 语言(vn.net 和 C#)、php 和 js,所以请像教一个完整的菜鸟一样解释。
这里是问题所在:我接收到的数据是 unsigned char 字符[12];然后我必须将该数据附加到 std::string
数据始终为 12 个字符长,并且不会以 null 结尾,因为它是通过选择从串行端口接收到的特定字节来收集的。
长话短说:
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?
谢谢
编辑:抱歉重复了,搜索没有return那个问题。
谢谢大家 - 可惜我不能标记多个答案!
您几乎已经掌握了,只需使用 string::push_back
instead of string::append
- append
用于连接 string
s,而 push_back
用于添加字符(并处理调整内部结构的大小等)。
使用 string
constructor is normally a better option but here could cause issues as your array isn't null-terminated (see here).
编辑:实际上,上面 link 中的构造函数 5 (from-sequence
) 应该是合适的(如果您愿意从 unsigned char *
转换为 const char *
,根据 this question+answer 是安全的):
std::string stroutput(reinterpret_cast<const char *>(characters), 12);
std::string
有 a constructorr 需要两个迭代器:
stroutput += std::string(characters, characters + 12);
要追加一个字符,您必须使用以下重载方法追加
basic_string& append(size_type n, charT c);
例如
stroutput.append(1, characters[0]);
stroutput.append(1, characters[1]);
否则使用方法push_back
或operator +=
。例如
stroutput += characters[0];
stroutput += characters[1];
如果你想附加整个数组或者它的一部分,那么你可以写
stroutput.append( reinterpret_cast<char *>( characters ), sizeof( characters ) );
stroutput.append( reinterpret_cast<char *>( characters ), n );
其中 n 是要追加的数组的字符数。
在 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)
用于空终止字符串参数,但未能找到为 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);
简介:考虑到我没有使用 C++ 的经验,但可以找到使用任何语言来完成基本任务的方法。 我的大部分经验是使用 .net 语言(vn.net 和 C#)、php 和 js,所以请像教一个完整的菜鸟一样解释。
这里是问题所在:我接收到的数据是 unsigned char 字符[12];然后我必须将该数据附加到 std::string
数据始终为 12 个字符长,并且不会以 null 结尾,因为它是通过选择从串行端口接收到的特定字节来收集的。
长话短说:
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?
谢谢
编辑:抱歉重复了,搜索没有return那个问题。 谢谢大家 - 可惜我不能标记多个答案!
您几乎已经掌握了,只需使用 string::push_back
instead of string::append
- append
用于连接 string
s,而 push_back
用于添加字符(并处理调整内部结构的大小等)。
使用 string
constructor is normally a better option but here could cause issues as your array isn't null-terminated (see here).
编辑:实际上,上面 link 中的构造函数 5 (from-sequence
) 应该是合适的(如果您愿意从 unsigned char *
转换为 const char *
,根据 this question+answer 是安全的):
std::string stroutput(reinterpret_cast<const char *>(characters), 12);
std::string
有 a constructorr 需要两个迭代器:
stroutput += std::string(characters, characters + 12);
要追加一个字符,您必须使用以下重载方法追加
basic_string& append(size_type n, charT c);
例如
stroutput.append(1, characters[0]);
stroutput.append(1, characters[1]);
否则使用方法push_back
或operator +=
。例如
stroutput += characters[0];
stroutput += characters[1];
如果你想附加整个数组或者它的一部分,那么你可以写
stroutput.append( reinterpret_cast<char *>( characters ), sizeof( characters ) );
stroutput.append( reinterpret_cast<char *>( characters ), n );
其中 n 是要追加的数组的字符数。
在 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)
用于空终止字符串参数,但未能找到为 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);