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日

悬赏问题

  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题