我有一个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()
方法,但都无法解决问题。
答案 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);