我正在尝试将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或为空。 我可以做一些其他的转换来返回字符串的其余部分吗?
非常感谢任何帮助。
答案 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 */
上
修改检查尺寸更为简单,因为 4 。
关于data
和null
终止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();
}