C ++将向量<byte>转换为第一个向量字节为0 </byte>的字符串

时间:2014-07-29 12:18:34

标签: c++ string vector byte zero

我正在尝试将BYTES(或unsigned char)的std :: vector转换为std :: string。 我遇到的问题是当向量的第一个元素是0时,然后在转换后返回一个空字符串。

我尝试过以下两种方法。 string1和string2都返回一个空字符串。 我期待的结果是一个字符串,以2 x 0开头,后跟几个其他字符。

// vector of BYTE, contains these 7 elements for example: (0,30,85,160,155,93,0)
std::vector<BYTE> data;

// method 1
BYTE* pByteArray = &data[0];
std::string string1 = reinterpret_cast<LPCSTR>(pByteArray);

// method 2
std::string string2(data.begin(),data.end());

// both string1 and string2 return ""

我在猜测因为向量中的第一个BYTE是0,所以字符串赋值认为它为null或为空。 我可以做一些其他的转换来返回字符串的其余部分吗?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

第二个并不是空的请考虑:

// vector of BYTE, contains these 7 elements for example: (0,30,85,160,155,93,0)
std::vector<BYTE> data = {0, 35, 35 ,38};

// method 2
std::string string2(data.begin(),data.end());
cout<< (string2.data()+1) << " size:"<< string2.size() << endl;
/* Notice that size is 4 */

ideone

修改检查尺寸更为简单,因为 4


关于datanull终止docs善解释(强调我的):

  

返回的数组以空值终止,即data()和c_str()执行相同的功能。如果empty()返回true,则指针指向   到一个空字符。 (自C ++ 11起)

“c ++ 98 safe”方式看起来像like

cout.write(string2.data()+1, string2.size()-1); 

无论如何,打印只是为了演示字符串“非空虚”:)

答案 1 :(得分:2)

第一种方法是错误的,但是第二种方法给出了正确的结果 - 字符串,即空终止。如果终止标记(null)是第一个字符,它看起来是空的,但实际上它不是。

另外,关于第一种方法,你想要:

std::vector<BYTE> data;
//some code
std::string string1(reinterpret_cast<const char *>(&data[0]), data.length());

答案 2 :(得分:0)

如果有人正在寻找像0x90 0xBA 0xFF这样的十六进制输出,那么这里是我用来生成它们的代码:

template <typename T>
std::string to_hex(T data)
{
    std::ostringstream result;
    result << std::setw(2) << std::setfill('0') << std::hex << std::uppercase << static_cast<int>(data);
    return result.str();
}

std::string dump(const std::vector<unsigned char>& data)
{
    if (data.empty()) return "";
    auto size = data.size();
    std::ostringstream result;
    for(u32 i =0; i < size; i++)
    {
        result << "0x" + to_hex(data[i]);
        if (i != size)
            result << " ";
    }
    return result.str();
}