将 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

本文关键字:字符串 转换 vector 1-2-3 DIGITS AS gt char unsigned lt      更新时间:2023-10-16

我想在屏幕上显示std::vector<unsigned char>中的数字,但在到达收件人的途中,我需要将这些数字塞入std::string中。

无论我尝试什么(atoireinterpret_caststring.c_str()...),都给了我一个废话,或者那些原始数字的字母表示 - 即它们相应的ASCII字符。

那么我如何轻松(最好是标准方法)将vector<unsigned char> {1,2,3}转换为string "1-2-3"呢?

在原始帖子(后来编辑)中,我提到,我可以用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::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::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::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);
});