如何将QByteArray转换为字节字符串?

时间:2019-12-28 18:38:36

标签: c++ qt5

我有一个QByteArray对象,其中有256个字节。但是,当我尝试将其转换为字节字符串(std::string)时,其长度为0到256。这与字符串的长度非常不一致,但是在字符串中始终有256个字节。数组。此数据是加密的,因此我希望输出256个字符的垃圾,但是我得到的是随机数的字节。

这是我用来尝试对其进行转换的代码:

// Fills array with 256 bytes (I have tried read(256) and got the same random output)
QByteArray byteRecv = socket->read(2048);
// Gives out random garbage (not the 256-character garbage that I need)
string recv = byteRecv.constData();

如果有必要知道,socket对象就是QTcpSocket*

有什么办法可以准确表示数组中的内容吗?我曾尝试将其转换为QString并使用QByteArray::toStdString()方法,但都无法解决问题。

1 个答案:

答案 0 :(得分:0)

QByteArray::constData()成员函数返回原始指针const char*std::string中的constructor来自原始指针

std::string(const char* s);

使用由s指向的终止为字符串的副本初始化的内容来构造字符串。字符串的长度由第一个空字符确定。如果s没有指向这样的字符串,则行为是不确定的。

您的缓冲区不是一个以空字符结尾的字符串,中间可以包含空字符。所以你应该使用另一个构造器

std::string(const char* s, std::size_type count);

使用count指向的字符串的前s个字符构造字符串。

也就是说:

std::string recv(byteRecv.constData(), 256);

对于原始字节的集合,std::vector可能是更好的选择。您可以从两个指针构造它:

std::vector<char> recv(byteRecv.constData(), byteRecv.constData() + 256);