std::string testdata = data;
QString str1("");
//str1.resize(data.size()*2+2);
for (quint32 i = 0; i < testdata.size(); ++i)
{
char c = testdata.at(i);
str1 += QString("%1|").arg(QString::number(c));
}
str1 = str1.left(str1.size()-1);
std::string ret8;
QStringList strlist = str1.split('|', QString::SkipEmptyParts);
for(int i = 0; i < strlist.size(); ++i)
{
ret8.push_back((char)strlist.at(i).toInt());
}
今天在讨论时发现了另一种思路。就是把二进制数据 加密为文本,比如base64,base16等,Qt有现存的算法,代码如下
std::string rawdata; //原有二进制数据
QByteArray byte = QByteArray::fromRowData(rawdata.c_str(), rawdata.size());
QString qstr = QString::fromAscii(byte.toHex());
std::string str;
QByteArray byte2 = QByteArray::fromHex(qstr.toAscii());
str.append(byte2.data(),byte2.size());
std::string testdata = data;
QString str = QString::fromUtf8(testdata.c_str(), testdata.size());
std::string ret;
QByteArray utf8 = str.toUtf8();
ret.append(utf8.data(),testdata.size());
不行
// std::string ret;
// //ret.append(bytes.data(), data.size());
//
// QByteArray bytes = QByteArray::fromRawData(data.c_str(), data.size());
// QString str(bytes);
//
// QByteArray bytes2 = str.toAscii();
// std::string ret2;
// ret2.append(bytes2.data(), bytes2.size());
// //bytes.resize(data.size());
// ret.append(bytes.data(), bytes.size());
// QBuffer buffer(&bytes);
// buffer.open(QIODevice::ReadOnly);
// QDataStream in(&buffer);
// QString qstr;
// in >> qstr;
// buffer.close();
//
// QByteArray byte3;
// byte3.resize(data.size());
// QBuffer buffer2(&byte3);
// buffer2.open(QIODevice::ReadWrite);
// QDataStream out(&buffer2);
// out << qstr;
// buffer2.close();
// std::string str3;
// str3.append(byte3.data(), byte3.size());
附带一个Base64的百科说明
base64维基百科:
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME, 在XML中存储复杂数据.