• 5554阅读
  • 2回复

[提问]对于QString转stdstring的一个问题 [复制链接]

上一主题 下一主题
离线justwake
 

只看楼主 倒序阅读 楼主  发表于: 2015-04-09
使用cryptopp库的时候遇到一个问题
使用AES加密字符串后返回的是一个std::string
根据需求,我需要将这个string转化为QString,然后解密的时候再把QString转化为string,
但是我发现QString转化的string和原来AES加密返回的string不一样...  
贴代码:(使用fromStdString和toStdString)
  1. std::string miyaosStr    = xlcp->encryptopp(QString("1234").toStdString());
  2.     for (int i=0; i < miyaosStr.length(); i++){
  3.         cout << (int)miyaosStr[i]<<" ";
  4.     }
  5.     cout << endl;
  6.     QString testsStr    = QString::fromStdString(miyaosStr);
  7.     std::string miyaosStr2    = testsStr.toStdString();
  8.     for (int i=0; i < miyaosStr2.length(); i++){
  9.         cout << (int)miyaosStr2[i] << " ";
  10.     }

结果是:
  1. 115 -50 115 81 -16 -42 -73 64 30 62 -32 -54 -124 61 -81 9
  2. 115 -17 -65 -67 115 81 -17 -65 -67 -42 -73 64 30 62 -17 -65 -67 -54 -124 61 -17 -65 -67 9
这样必然导致解密失败


但是使用fromLatin1和toLatin1却是正确的:
贴代码:(使用fromLatin1和toLatin1)
  1. std::string miyaosStr    = xlcp->encryptopp(QString("1234").toStdString());
  2.     for (int i=0; i < miyaosStr.length(); i++){
  3.         cout << (int)miyaosStr[i]<<" ";
  4.     }
  5.     cout << endl;
  6.     QString testsStr    = QString::fromLatin1(miyaosStr.c_str());
  7.     std::string miyaosStr2    = testsStr.toLatin1().data();
  8.     for (int i=0; i < miyaosStr2.length(); i++){
  9.         cout << (int)miyaosStr2[i] << " ";
  10.     }

的结果就是:
  1. 115 -50 115 81 -16 -42 -73 64 30 62 -32 -54 -124 61 -81 9
  2. 115 -50 115 81 -16 -42 -73 64 30 62 -32 -54 -124 61 -81 9

不理解   toStdString和toLatin1.data()  的区别了,有人能帮忙吗?

本帖提到的人: @XChinux
离线dbzhang800

只看该作者 1楼 发表于: 2015-04-09
QString 是 unicode 字符串
std::string 是 char  字节流

unicode字符串 和 char 字节流之间的转换,有相当多种可能(gbk/utf8/utf16-be/utf16-le/...)。

具体到Qt中的 to/fromStdString,在Qt4下和Qt5也不一样。

题外:你为什么要转QString呢?如果你不涉及unicode字符串的问题,应该用QByteArray。
离线justwake

只看该作者 2楼 发表于: 2015-04-10
回 dbzhang800 的帖子
dbzhang800:QString 是 unicode 字符串
std::string 是 char  字节流
unicode字符串 和 char 字节流之间的转换,有相当多种可能(gbk/utf8/utf16-be/utf16-le/...)。
....... (2015-04-09 17:15)

嗯,谢谢版主的回答!根据您的回答,我是不是可以这样认为,
在编码有可能不一致的情况,转化stdstring和QString的操作有可能是不可逆的?



快速回复
限100 字节
 
上一个 下一个