qq_35087814 2022-09-05 20:57 采纳率: 20%
浏览 55
已结题

QList在两个函数中第一个元素值不一样

本人使用一个QList模拟队列存储字符数组,每个字符数组的大小大概在4000-14000,代码如下:
QList<char *> Package_Queue;
下列入队和出队函数中,testchar是我申明的全局变量,一个字符指针,用于测试两个函数中获取到的第一个元素是否相同。
入队函数:

    while(!queuelock->tryLock()){}
    package_head head; //数据包头
    memset(&head,0,sizeof (package_head));
memcpy(&head,package,sizeof (package_head));
Package_Queue.push_back(package);
testchar=*(Package_Queue.begin());
 qDebug()<<"enenqueue crc check"<<head.CRCCode<<crc32_itu(testchar+sizeof (package_head),head.fileSize)<<endl;  //对比生成的CRC校验
qDebug()<<"compare  enqueue char[]"<<strcmp((*Package_Queue.begin() ),(package))<<endl; //对比出队的数据是否相等
emit packageQueue_new();
queuelock->unlock();
};

出队函数:

char* QueueManage::popqueue_Package_Queue(){
    while(!queuelock->tryLock()){}
    if(Package_Queue.isEmpty())
        return nullptr;
    package_head head;
    memset(&head,0,sizeof (package_head));
    char *data;
    data=Package_Queue.takeFirst();
     memcpy(&head,data,sizeof (package_head));
    qDebug()<<"pop queue crc check"<<head.CRCCode<<crc32_itu(data+sizeof (package_head),head.packSize-sizeof (package_head))<<head.fileSize<<endl;;
    qDebug()<<"compare  pop char[]"<<strcmp(testchar,data)<<endl;
    emit PackageQueue_pop();
    queuelock->unlock();
    return data;
};

CRC32校验的代码如下:

uint32_t QueueManage::crc32_itu(char *data, int length){
    uint8_t i;
     uint32_t crc = 0xffffffff;  // Initial value
     while(length--)
       {
        crc ^= *data; data++;
        for (i = 0; i < 8; ++i)
        {
        if (crc & 1)
          crc = (crc >> 1) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7
         else
        crc = (crc >> 1);
          }}
     return ~crc;
};

然后运行中出现了如下输出:
enenqueue crc check 698326302 698326302 //入队时,两个crc校验码相同
compare enqueue char[] 0
pop queue crc check 698326302 865988787 //出队函数中,还是原来的char指针,生成的crc校验却不同
compare pop char[] 0
但是比较第一个元素和出队的元素,又是相同的,想请教下是什么情况,怎么解决

  • 写回答

2条回答 默认 最新

  • _GX_ 2022-09-05 21:49
    关注

    入队函数中传给crc32_itu第二个参数是head.fileSize
    出队函数中传给crc32_itu第二个参数是head.packSize-sizeof (package_head)
    你确定这两个数值是一样的吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月14日
  • 已采纳回答 9月6日
  • 创建了问题 9月5日

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题