• QByteArray引发的bug

在接收UDP数据的函数里,有如下代码片段

    if(0x10 == data.size() && 0xCA == (unsigned char)data.at(10) && 0x01 == (unsigned char)data.at(11))
{ }
else if(0X00 == (unsigned char)data.at(10) && 0XB0 == (unsigned char)data.at(11))
{ }
else if(0X02 == (unsigned char)data.at(10) && 0XB1 == (unsigned char)data.at(11))
{ }
else if(0X01 == (unsigned char)data.at(10) && 0XB0 == (unsigned char)data.at(11))
{ }
else if(0X00 == (unsigned char)data.at(10) && 0XB3 == (unsigned char)data.at(11))
{ }
else if(0x0E == data.size() && 0xCA == (unsigned char)data.at(10) && 0X02 == (unsigned char)data.at(11))
{ }

这个函数的声明为void Net_Operator::SLOT_UDP_RecvData(QByteArray data),其中data是QByteArray类型的变量,是收到的UDP数据,在上面的代码片段中,对收到的UDP数据进行解析。

一开始我写的是

if(0x10 == data.size() && 0xCA == data.at(10) && 0x01 == data.at(11))

和正确的代码片段只是差一个unsigned char,但是我一开始的写法,即使收到了正确格式的UDP数据,也没有办法进行解析。

  • 问题的发现

    有如下代码
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray ba;
ba.resize(5);
ba[0] = 0Xc3;
ba[1] = 0Xb8;
ba[2] = 0X64;
ba[3] = 0X18;
ba[4] = 0Xca; if(ba.at(0) == 0xc3)
{
qDebug() << "ba.at(0) = 0xc3";
}
else
{
qDebug() << "ba.at(0) != 0xc3";
}
return a.exec();
}

在Qt中输出

ba.at(0) != 0xc3

经过思考发现,QByteArray是char类型,而char类型中0XC3的最高位表示的是符号位,也就是说ba.at(0)应该是-61。而0XC3是unsigned char类型,对应的是195。-61和195相比较,必然是不相等。

  • unsigned char和char类型的区别

    在内存当中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255。

    也就是说在比较两个大于零的数的时候,没问题,可以比较,但是当char的值为负数,如-1时,是没有办法和unsigned char类型的变量进行比较的。

  • 回顾一开始的问题

    所以if(0x10 == data.size() && 0xCA == (unsigned char)data.at(10) && 0x01 == (unsigned char)data.at(11))在比较0xCAdata.at(10)的时候,必须要加unsigned char

QByteArray引发的bug的更多相关文章

  1. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

  2. 安卓微信overflow-x overflow-y引发的bug

    今天xgo文章图片页上线用微信扫页面发现一个bug,页面可以双击放大缩小. 找了半天原因,发现是图片描述设置了overflow-y引发的bug. 建议在微信场景里满屏显示不能滚动的页面里慎用overf ...

  3. 一次关于使用status作为变量引发的bug及思考

    这个bug出现在一年前,当时自己大学还没毕业,刚刚进入一家公司实习.那个时候还没有用seajs或者requirejs那样的模块化管理的库,也没有用一个自执行的函数将要执行的代码包裹起来,于是bug就在 ...

  4. 公用表表达式(CTE)引发的改变执行顺序同WHERE条件顺序引发的bug

    以下模拟一下CTE出错 /*测试环境 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyr ...

  5. 由CHAR(2)引发的BUG

    我们在设计数据库标志位字段时,为考虑其扩展性,一般会设置为CHAR(2),例如 FLAG CHAR(2),这样我们就需要注意了,如果你给字段 FLAG赋值为‘0’,它在数据库中的真实情况是‘0+空格’ ...

  6. 多线程+fork 引发的bug查找

    1. 问题描述 某个server SA是一个多线程服务器,主线程会调用fork,再exec生成工作进程SB. 实际上,SA的主线程fork出了一个子线程,但没有执行exec. # ps ajxf | ...

  7. Struts2 一张图片引发的bug

    今天如常的打开项目开放.写了一会保存测试.在登录时出了个错误当不影响正常使用.丫的昨天还好好的.行下手上的工作 开始找bug 错误核心代码如下: 10:34:46,442  WARN OgnlValu ...

  8. 一个int类型引发的bug

    一.引言 今天我在项目开发中,遭遇了一个莫名其妙的问题,概括加抽象后形成如下问题:在使用MyBatis的XML语句实现Dao层接口 List<Person> selectBySome(@P ...

  9. 储存过程嵌套临时表同名引发的BUG?

    临时表使用:存储过程嵌套时,均创建了相同名称的临时表. create procedure SP_A ( @i int output )asbegin create table #t ( ta int ...

随机推荐

  1. 【Java基础】JAVA 使用线程的几种方式

    之前放在自己网站上的例子,因为网站关闭,已经找不到了,想用的时候,没有的话又重新翻书是很麻烦的事情.所以重新记录一下,以备将来查看. 第一种,让任务类继承Runable接口,然后将任务类对象放入Thr ...

  2. java:IO流(处理流(缓冲流,转换流,数据流),对象的序列化,Properties)

    字节缓冲流:(BufferedInputStream,BufferedOutStream) *按照流的功能来分:节点流和处理流 *节点流可以直接操作数据源: *InputStream *--FileI ...

  3. centos7.5 升级kernel内核版本

    一,查看当前系统内核版本信息 awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg 或 ...

  4. 【机器学习】【数字信号处理】矢量量化(Vector Quantization)

    http://blog.csdn.net/zouxy09 这学期有<语音信号处理>这门课,快考试了,所以也要了解了解相关的知识点.呵呵,平时没怎么听课,现在只能抱佛脚了.顺便也总结总结,好 ...

  5. Django框架中使用Echart进行统计的SQL语句

    最近想用Echart做数据统计的图形显示,数据来源是MySQL数据库,自然需要根据不同的搜索条件筛选出表中的数据,用比较多的就是时间的参数吧! 常用的mysql时间的条件进行检索的SQL语句: 数据表 ...

  6. springboot笔记-文件上传

    使用 Spring Boot 和 Thymeleaf 上传文件 Spring Boot 利用 MultipartFile 的特性来接收和处理上传的文件,本示例前端页面使用 Thymeleaf 来处理. ...

  7. Zookeeper 和Eureka比较

    作为服务注册中心,Eureka比Zookeeper好在哪里著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性P在是分布式系统中必须要保证的, ...

  8. CF 11D A Simple Task 题解

    题面 这道题的数据范围一看就是dfs或状压啦~ 本文以状压的方式来讲解 f[i][j]表示目前的节点是i,已经经历过的节点的状态为j的简单环的个数: 具体的转移方程和细节请看代码: PS:(i& ...

  9. RegexKitLite库的使用

    首先在官网:  http://regexkit.sourceforge.net/下载RegexKitLite.h和RegexKitLite.m两个文件 将其添加到工程目录下 取消自动引用计数ARC 手 ...

  10. 反向传播算法-损失函数&激活函数

    在监督学习中,传统的机器学习算法优化过程是采用一个合适的损失函数度量训练样本输出损失,对损失函数进行优化求最小化的极值,相应一系列线性系数矩阵W,偏置向量b即为我们的最终结果.在DNN中,损失函数优化 ...