• 10418阅读
  • 9回复

关于QString、QDataStream、QByteArray的疑惑 [复制链接]

上一主题 下一主题
离线thinkbad
 

只看楼主 倒序阅读 楼主  发表于: 2010-04-06
写网络方面的程序总要用这几个类,发现个问题,代码如下
  1.     QString test = "test";
  2.     QByteArray datagram;
  3.     QDataStream in(&datagram,QIODevice::WriteOnly);
  4.     in.setVersion(QDataStream::Qt_4_6);
  5.     in.setByteOrder(QDataStream::LittleEndian);
  6.     in << test;


debug调试查看datagram发现这样的结果

内容似乎要多出一些

同时datagram.data()后得到const char * 查看内存中的字节

为什么test前面会多出4个字节?
离线yangfanxing
只看该作者 1楼 发表于: 2010-04-06
  1.     in.setVersion(QDataStream::Qt_4_6);
  2.     in.setByteOrder(QDataStream::LittleEndian);
PHPWind好恶心。。。不想看这种界面。。。
离线thinkbad

只看该作者 2楼 发表于: 2010-04-06
我只是设置了小端位而已 不设置不就是 00 74 00 65 00 73 00 74只是高低顺序的问题
我的意思是请看两个图中 test前后的是什么玩意? 特别是前面怎么还有四个字节
离线yangfanxing
只看该作者 3楼 发表于: 2010-04-06
后边的你管它干哈,内存的一些随机数;
前边分配32个字节用于存贮QByteArray的大小;
test = 4 X 2 = 8
比如你再设QString = "12345";那么存的东西就是5 * 2 = 10
PHPWind好恶心。。。不想看这种界面。。。
离线dbzhang800

只看该作者 4楼 发表于: 2010-04-06
引用第2楼thinkbad于2010-04-06 10:15发表的  :
我只是设置了小端位而已 不设置不就是 00 74 00 65 00 73 00 74只是高低顺序的问题
我的意思是请看两个图中 test前后的是什么玩意? 特别是前面怎么还有四个字节

打开 assistant,多看看Qt自带的 manual
http://qt.nokia.com/doc/4.6/datastreamformat.html
  1. QString    
  2.     * If the string is null: 0xFFFFFFFF (quint32)
  3.     * Otherwise: The string length in bytes (quint32) followed by the data in UTF-16
离线yangfanxing
只看该作者 5楼 发表于: 2010-04-06
置于为什么*2,这个跟支持的国际化有关;比如存储中文,它就需要2个Byte,所以就连存一个英文字符也就用2个字节了。
PHPWind好恶心。。。不想看这种界面。。。
离线thinkbad

只看该作者 6楼 发表于: 2010-04-06
谢谢各位,但现在我有个需求,我要发送的数据包,只想包含内容,而不要其他信息比如前面的代表长度的四个字节,因为解析时是直接按字节位数解析(非qt开发的程序)
离线yangfanxing
只看该作者 7楼 发表于: 2010-04-06
扣除前边4位呗。。。
PHPWind好恶心。。。不想看这种界面。。。
离线thinkbad

只看该作者 8楼 发表于: 2010-04-06
每次还要这么麻烦? 有没有更好的方法呢?  我要发的数据包是这样的(服务端通信协议约定的)
short flag 标志位 两字节
int qqnumber 号码 四个字节
short msgLength 消息长度 两个字节
CString msgBody 消息内容

qt里用什么好的方案替代mfc里这种

http://qt.nokia.com/doc/4.6/datastreamformat.html
数据格式就这么些
离线babybluema

只看该作者 9楼 发表于: 2010-04-10
可以自己定义个数据格式吧
快速回复
限100 字节
 
上一个 下一个