二进制std::string 与QString转换的问题


std::string 存的二进制数据,与QString互转(由于某种原因需要用QString传递),暂时想到的方法,而且可行

                    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中存储复杂数据.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值