• 265阅读
  • 19回复

[原创]QString 转QBytearray 出错?? [复制链接]

上一主题 下一主题
离线foxgod
 

只看楼主 倒序阅读 楼主  发表于: 07-09
怎么转换都不对?请大神帮忙?
  1. QByteArray str1 = "\xAB\xAB\x01\x01\x01""2\xC0\x1F\xA8\xC0p\x17\xC0\x1F\xA8\xC0q\x17\x00\x00\x00\x03\x00\x00\x00\xCB\xD1\xD1\x00\x00\xBA\xBA";
  2. QString str;
  3. str = str.append( str1);
  4. QByteArray str2 = str.toUtf8();
  5. qDebug()<<str2;//内容和原来的不一样;
  6. str2 = str.toLatin1();
  7. qDebug()<<str2;//内容和原来的不一样;
  8. str2 = str.toLocal8Bit();
  9. qDebug()<<str2;//内容和原来的不一样;


怎么回事,第一个遇到,我本来是想在json里面插入这个QByteArray,解析出错了,才打印QByteArray 转QString ,发现前后不一样
离线20091001753

只看该作者 1楼 发表于: 07-09
QByteArray 的数据,转换成用字符表达,是 toHex,反之 fromHex
但是这与 QString::toUtf8 又是有区别的

hex 是把16进制的数据用字符表达,utf8 是文本编码

啊,请恕我表达能力有限。
(づ ̄ 3 ̄)づ
离线foxgod

只看该作者 2楼 发表于: 07-09
回 20091001753 的帖子
20091001753:QByteArray 的数据,转换成用字符表达,是 toHex,反之 fromHex
但是这与 QString::toUtf8 又是有区别的
hex 是把16进制的数据用字符表达,utf8 是文本编码
....... (2019-07-09 20:44) 

我本来是个结构体的数据,把结构体转为了CHAR*,然后转为QBytearray,因为要把这个char*,插入到json里面,返回解析json的时候,发现数据不对了。解析结构体出错了,不知道问题在哪里
离线fsu0413

只看该作者 3楼 发表于: 07-09

QString str;
str = str.append( str1);


这段需要保证str1是有效的utf8(Qt5)/有效的Latin1(Qt4),否则转换会出现乱码

离线foxgod

只看该作者 4楼 发表于: 07-09
回 fsu0413 的帖子
fsu0413:这段需要保证str1是有效的utf8(Qt5)/有效的Latin1(Qt4),否则转换会出现乱码
....... (2019-07-09 21:33)

就是出错了,解析出来的char字段不一样了,你觉得应该如何做呢?需要对str1进行编码吗?
离线fsu0413

只看该作者 5楼 发表于: 07-09
回 foxgod 的帖子
foxgod:就是出错了,解析出来的char字段不一样了,你觉得应该如何做呢?需要对str1进行编码吗?
 (2019-07-09 21:36) 

你要转换这段二进制为字符串还是?
如果是的话知道原来是什么编码么?加密了么?
离线foxgod

只看该作者 6楼 发表于: 07-09
回 fsu0413 的帖子
fsu0413:你要转换这段二进制为字符串还是?
如果是的话知道原来是什么编码么?加密了么? (2019-07-09 21:52) 

原来是个结构体,我转为了char* ,然后转为了QByteArray,在转为QString  ,传给接收方后,在解析出QByteArray,

对方的char* 转为QByteArray后的数据是
QByteArray str1 = "\xAB\xAB\x01\x01\x01""2\xC0\x1F\xA8\xC0p\x17\xC0\x1F\xA8\xC0q\x17\x00\x00\x00\x03\x00\x00\x00\xCB\xD1\xD1\x00\x00\xBA\xBA";
离线fsu0413

只看该作者 7楼 发表于: 07-09
回 foxgod 的帖子
foxgod:原来是个结构体,我转为了char* ,然后转为了QByteArray,在转为QString  ,传给接收方后,在解析出QByteArray,
对方的char* 转为QByteArray后的数据是
QByteArray str1 = "\xAB\xAB\x01\x01\x01""2\xC0\x1F\xA8\xC0p\x17\xC0\x1F\xA8\xC0q\x17\x00\x0 .. (2019-07-09 21:58) 

用json的面向对象的方法传啊,string又不是bytearray,这玩意不是用来存raw数据的
离线foxgod

只看该作者 8楼 发表于: 07-09
回 fsu0413 的帖子
fsu0413:用json的面向对象的方法传啊,string又不是bytearray,这玩意不是用来存raw数据的 (2019-07-09 22:01) 

你是什么意思???我不是很明白
离线fsu0413

只看该作者 9楼 发表于: 07-09
回 foxgod 的帖子
foxgod:
你是什么意思???我不是很明白


举个例子
  1. struct {
  2.     int a;
  3.     char b[50]; // 这玩意是真正的字符串
  4.     bool c;
  5. } str = {...};
  6. QJsonObject ob;
  7. ob["a"] = str.a;
  8. ob["b"] = QString::fromUtf8(str.b);
  9. ob["c"] = str.c;
  10. QJsonDocument doc(ob);


不是

  1. QJsonObject ob;
  2. ob["str"] = QString::fromUtf8(QByteArray((void *)(&str)));
  3. QJsonDocument doc(ob);


离线fsu0413

只看该作者 10楼 发表于: 07-09
哦对,还有一种情况,就是你的结构体里可能有非POD的数据,举另外一个例子
  1. struct {
  2.     QString x;
  3. };

这种是不能直接传bytearray的
离线foxgod

只看该作者 11楼 发表于: 07-09
回 fsu0413 的帖子
fsu0413:哦对,还有一种情况,就是你的结构体里可能有非POD的数据,举另外一个例子
struct {
    QString x;
};
这种是不能直接传bytearray的
....... (2019-07-09 22:13)

我的结构体里面目前只有int类型,没有字符

我只这样做的
  1. struct {
  2.     int a;
  3.     int b; // 这玩意是真正的字符串
  4.     int c;
  5. } str;

str object;
object.a = 1;
object.b =2;
object.c=3;
char* st1 = (char*)&object;
QByteArray st2 = QByteArray (st1,sizeof(str));
离线foxgod

只看该作者 12楼 发表于: 07-09
回 20091001753 的帖子
20091001753:QByteArray 的数据,转换成用字符表达,是 toHex,反之 fromHex
但是这与 QString::toUtf8 又是有区别的
hex 是把16进制的数据用字符表达,utf8 是文本编码
....... (2019-07-09 20:44) 

我只这样做的
struct {
    int a;
    int b; // 这玩意是真正的字符串
    int c;
} str;

str object;
object.a = 1;
object.b =2;
object.c=3;
char* st1 = (char*)&object;
QByteArray st2 = QByteArray (st1,sizeof(str));

QString st3 = st2;
QByteArray st4 = st3.toLocal8Bit();
转回来就错了,请教下这样做有问题吗??


离线dbzhang800

只看该作者 13楼 发表于: 07-09
如果你贴的代码不是示意代码,而是你真的测试代码,那么暴露的问题有点多

1. 第一行 QByteArray 构造时,里面含有 "\x00",这代表C字符串的结束,之后的东西都被截断了
2. 第四行 str1 使用UTF8转换成QString,前提是str1是有效的utf8字符串,但你这显然不是

再之后的已经没意义了
离线foxgod

只看该作者 14楼 发表于: 07-10
回 dbzhang800 的帖子
dbzhang800:如果你贴的代码不是示意代码,而是你真的测试代码,那么暴露的问题有点多
1. 第一行 QByteArray 构造时,里面含有 "\x00",这代表C字符串的结束,之后的东西都被截断了
2. 第四行 str1 使用UTF8转换成QString,前提是str1是有效的utf8字符串,但你这显然不是
....... (2019-07-09 23:32) 

结构体转char*,在转为QByteArray,是否可以转QString,在插入json里面呢??
离线dbzhang800

只看该作者 15楼 发表于: 07-10
QByteArray 和 QString 互转有无数种方式

如果你QByteArray中的字符不可控,而且QString只是个中转,只是为了稍后能转回QByteArray,那么latin1,latin2,latin3,... 等干这个事情都是安全的。gbk,utf8等干这个明显是不合适的。

如果QByteArray中字符不可控,先转成可控字符明显更简单,比如通过:QByteArray::toHex() 和 fromHex(),或者 fromBase64() 和 toBase64() ,或者 ....
离线fsu0413

只看该作者 16楼 发表于: 07-10
回 foxgod 的帖子
foxgod:结构体转char*,在转为QByteArray,是否可以转QString,在插入json里面呢?? (2019-07-10 08:46) 

为什么要沉迷于转成char*呢?
结构体和本来在json里和对象结构类似,直接用json对象多好
离线foxgod

只看该作者 17楼 发表于: 07-11
回 fsu0413 的帖子
fsu0413:为什么要沉迷于转成char*呢?
结构体和本来在json里和对象结构类似,直接用json对象多好 (2019-07-10 23:09) 

和别的平台对接,别的平台的不是qt,传给他们的是char *,传过来的也是char*
离线foxgod

只看该作者 18楼 发表于: 07-11
回 dbzhang800 的帖子
dbzhang800:QByteArray 和 QString 互转有无数种方式
如果你QByteArray中的字符不可控,而且QString只是个中转,只是为了稍后能转回QByteArray,那么latin1,latin2,latin3,... 等干这个事情都是安全的。gbk,utf8等干这个明显是不合适的。
如果QByteArray中字符不可控,先转成可控字符明显 .. (2019-07-10 11:28) 

感觉结构体转char*在转QByteArray,在转char*后在解析这个结构体是正确的,但是结构体转char*在转QByteArray在转QString后,里面的内容就出错了,结构体不可以转QString是不是???
离线fsu0413

只看该作者 19楼 发表于: 07-13
回 foxgod 的帖子
foxgod:和别的平台对接,别的平台的不是qt,传给他们的是char *,传过来的也是char* (2019-07-11 08:47) 

Json是平台无关的
快速回复
限100 字节
 
上一个 下一个