zoukankan      html  css  js  c++  java
  • QByteArray引发的bug

    • 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

  • 相关阅读:
    如何解决aws解绑银行卡问题?
    如何解决macbook pro摄像头不工作的问题
    Window安装AutoCAD
    Mac应用程序无法打开,提示不明开发者或文件损坏的处理方法
    Android硬件抽象层(HAL)深入剖析(三)【转】
    Android硬件抽象层(HAL)深入剖析(二)【转】
    Android硬件抽象层(HAL)深入剖析(一)【转】
    Glide的用法
    Gradle-5.3:依赖-管理依赖的版本(传递(transitive)排除(exclude)强制(force)动态版本(+))
    Android 7.0 FileProvider 使用说明
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11775515.html
Copyright © 2011-2022 走看看