• 126阅读
  • 2回复

QByteArray的constData遍历问题 [复制链接]

上一主题 下一主题
离线spygg
 

只看楼主 倒序阅读 楼主  发表于: 12-01

在遍历QByteArray的constData()时遇到问题,希望大神可以帮忙解惑,一种方法是每一次都取constData(),另一种方法是在循环开始前获取constData()后面每次只是移动指针(该方法会给出异常结果),代码如下:
第一种方法:
  1. QByteArray peerAddrs = peers.toByteArray();
  2. for(int i = 0; i < peerAddrs.size(); i += 6)
  3. {
  4.     //每次都获取指针
  5.     uchar *p = (uchar*)peerAddrs.constData() + i;
  6.     
  7.     //大端字节序
  8.     quint32 uiIp = qFromBigEndian<quint32>(p);
  9.     quint16 uiPort = qFromBigEndian<quint16>(p + 4);
  10.     m_listPeers.append(tmpAddr);
  11. }


第二种方法(结果错误)
  1. QByteArray peerAddrs = peers.toByteArray();
  2. //第一次获取
  3. uchar *p = (uchar*)peerAddrs.constData();
  4. for(int i = 0; i < peerAddrs.size(); i += 6)
  5. {
  6.     //移动指针
  7.     p += i;
  8.     //大端字节序
  9.     PEER_ADDR tmpAddr;
  10.     quint32 uiIp = qFromBigEndian<quint32>(p);
  11.     quint16 uiPort = qFromBigEndian<quint16>(p + 4);
  12.     m_listPeers.append(tmpAddr);
  13. }


那啥,提供下QByteArray的内容
"d8:completei1945e10:incompletei58e8:intervali1800e5:peers198:\\uk\xF6\x1A\xE2QA\xC5\x17""A\xF1\x05""d\x15\xD3""A\xF1T\x9D\x1E\xAE\xC8\xD6""3\x0F""e\xEC\xEF(\xB9\x15\xD8\x9A\xE1}%\xBB\x16\xE4\xCFK\xB9\x94\x03@\xDF""2_\x9A\x13\xBA\xC8\xD5%\x87W\xD2\x1A\xE1\x05\xE4\x81>A\xF1\xD5\x88S\xA4\xC8\xD5X\xBD\xFD\x19\xC8\xD5X\xC6,{\x1B""CR\x01\xB4\x07\xE7tP\xE4\x04\xC2\xC8\xD5""6$?m\x84[_\xF4K\x8D\xC8\xE1\xC3\x9A\xEDT\x18+^.R\xD9\xC8\xD5m\xBE/\xF2\xC8\xD5""3\x0F\n\x95\xAF\xC8\x05\xBD\xAE_\xC0\fl;\b\x8F\xEA`\xD2""6 \xB8\xC0\x03\xBC\x8F\x12<i\x01v\xBD\xCB""2\xB6\xE5\xB0\x1F@'\xC8\xD5\xB3\xC6\x14\xEE\xC8\xD5Ox\x95\x07\xC8\xD5\xB1\x1E""2\x1F\xDA\xEAN\xF9\x94\f\xC8\xD5\xAD\xE1\xD8\xB6#'e"



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

只看该作者 1楼 发表于: 12-02
大哥,你在for循环里面这么移动指针,会把自己搞死的。

    p += i;

你把这句改成 p += 6;
而且不能放在那个位置,才能和原来的效果一样。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线spygg

只看该作者 2楼 发表于: 12-03
回 uidab 的帖子
uidab:大哥,你在for循环里面这么移动指针,会把自己搞死的。
    p += i;
你把这句改成 p += 6;
....... (2018-12-02 14:36) 

嗯嗯,谢谢了,还以为是Qt的bug
快速回复
限100 字节
 
上一个 下一个