将 vector<unsigned char> {1,2,3} 转换为字符串 "1-2-3" AS DIGITS
Convert vector<unsigned char> {1,2,3} into string "1-2-3" AS DIGITS
我想在屏幕上的 std::vector<unsigned char>
中显示数字,但在发送给收件人的途中,我需要将这些数字填入 std::string
。
无论我尝试什么(atoi
、reinterpret_cast
、string.c_str()
...),要么是胡说八道,要么是这些原始数字的字母表示——即它们对应的 ascii字符。
那么我如何轻松(最好是标准方法)将 vector<unsigned char> {1,2,3}
转换为 string "1-2-3"
?
在原文 Post(后来编辑)中我提到,我可以在 C# 或 Java 中做到这一点。
应 πìντα ῥεῖ 的要求提供 C# 示例或 Java,这里是一个快速的 Linq C# 方式:
public static string GetStringFromListNumData<T>(List<T> lNumData)
{
// if (typeof(T) != typeof(IConvertible)) throw new ArgumentException("Expecting only types that implement IConvertible !");
string myString = "";
lNumData.ForEach(x => myString += x + "-");
return myString.TrimEnd('-');
}
只需使用 std::ostringstream
:
std::vector<unsigned char> v{1,2,3};
std::ostringstream oss;
bool first = true;
for(auto x : v) {
if(!first) oss << '-';
else first = false;
oss << (unsigned int)x;
}
std::cout << oss.str() << std::endl;
我是这样处理的:
std::vector<unsigned char> v {1, 2, 3};
std::string s; // result
auto sep = ""; // continuation separator
for(auto n: v)
{
s += sep + std::to_string(n);
sep = "-"; // change the continuation separator after first element
}
std::cout << s << '\n';
连续分隔符 开始时为空,并在连接第一个输出后发生变化。
输出:
1-2-3
然而,另一个例子:
std::vector<unsigned char> v{1,2,3};
std::ostringstream str;
std::transform(v.begin(), v.end(), std::ostream_iterator<char>(str, "-"), [](unsigned char c){ return '0' + c;});
std::cout << str.str();
[编辑]
不幸的是,上面将添加额外的尾随 -
符号,以防止它 - 需要更复杂的代码:
std::transform(v.begin(), v.end(), std::ostream_iterator<std::string>(str), [&](auto c){
return (str.rdbuf()->in_avail() ? "-" : "") + std::to_string(c);
});
我想在屏幕上的 std::vector<unsigned char>
中显示数字,但在发送给收件人的途中,我需要将这些数字填入 std::string
。
无论我尝试什么(atoi
、reinterpret_cast
、string.c_str()
...),要么是胡说八道,要么是这些原始数字的字母表示——即它们对应的 ascii字符。
那么我如何轻松(最好是标准方法)将 vector<unsigned char> {1,2,3}
转换为 string "1-2-3"
?
在原文 Post(后来编辑)中我提到,我可以在 C# 或 Java 中做到这一点。 应 πìντα ῥεῖ 的要求提供 C# 示例或 Java,这里是一个快速的 Linq C# 方式:
public static string GetStringFromListNumData<T>(List<T> lNumData)
{
// if (typeof(T) != typeof(IConvertible)) throw new ArgumentException("Expecting only types that implement IConvertible !");
string myString = "";
lNumData.ForEach(x => myString += x + "-");
return myString.TrimEnd('-');
}
只需使用 std::ostringstream
:
std::vector<unsigned char> v{1,2,3};
std::ostringstream oss;
bool first = true;
for(auto x : v) {
if(!first) oss << '-';
else first = false;
oss << (unsigned int)x;
}
std::cout << oss.str() << std::endl;
我是这样处理的:
std::vector<unsigned char> v {1, 2, 3};
std::string s; // result
auto sep = ""; // continuation separator
for(auto n: v)
{
s += sep + std::to_string(n);
sep = "-"; // change the continuation separator after first element
}
std::cout << s << '\n';
连续分隔符 开始时为空,并在连接第一个输出后发生变化。
输出:
1-2-3
然而,另一个例子:
std::vector<unsigned char> v{1,2,3};
std::ostringstream str;
std::transform(v.begin(), v.end(), std::ostream_iterator<char>(str, "-"), [](unsigned char c){ return '0' + c;});
std::cout << str.str();
[编辑]
不幸的是,上面将添加额外的尾随 -
符号,以防止它 - 需要更复杂的代码:
std::transform(v.begin(), v.end(), std::ostream_iterator<std::string>(str), [&](auto c){
return (str.rdbuf()->in_avail() ? "-" : "") + std::to_string(c);
});