本人使用一个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
但是比较第一个元素和出队的元素,又是相同的,想请教下是什么情况,怎么解决