首页 > 编程知识 正文

qt程序异常结束的原因,一个异常将终止

时间:2023-05-06 04:02:37 阅读:168828 作者:2539

目录

关于0x00提前结束的问题

如果存在以下文件,则数据包含大量0x00

1、使用q文件读取文件的qfilefirmwarefile (文件路径); firmware file.open (qiodevice :3360只读; //方法1 :读取所有qbytearrayba=firmware file.read all (; //正确//方法2 :读取一行并指定长度char buf [ 1024 ] qint 64 linelength; linelength=firmware file.readline (buf,sizeof ) buf ); //正确。 此时,不要看错误中的数据。 因为存在0x00,所以在debug中只能看到前两个字节。 //方法3 :读取指定长度至缓冲区int num=1024*1每次固件大小char *sendBuffer=new char[num] (; linelength=firmware file.read (send buffer,num ); //正确,此时请不要用debug查看sendBuffer中的数据。 由于存在0x00,因此在debug中只能看到前两个字节的delete [] sendBuffer。 firmwarefile.close (; 2、用文件读取文件qfileinfofileinfo=qfileinfo (文件路径); qtringfilename=fileinfo.filename (; STD :3360 stringstr=file path.tostdstring (; FILE *fp fopen_s(FP,str.c_str ),' r ' ); char * data buffer=new char [ fileinfo.size () ]; fread(databuffer,fileInfo.size ),1,fp ); //正确,此时请不要调试数据缓冲器中的数据。 由于存在0x00,因此在debug中只能看到前两个字节的delete [] dataBuffer。 flose(FP ); 3、将从QByteArray到char *的*文件数据读入QByteArray时,需要取出QByteArray的数据时,有以下两种方法

方法1 :

qbytearrayba=firmware file.read all (; char * data buffer=new char [ ba.size () ]; memcpy(databuffer,ba.data ),ba.size ); qdebug(ba.size )=ba.size ); for(intI=0; i ba.size (; I ) q debug (数据缓冲器[ I ] ); }方法2 :

qbytearrayba=firmware file.read all (; char *data=ba.data (; while(*data )//错误,while循环遇到前0x00时退出) { qDebug ) *data; 数据; }for(intI=0; i ba.size (; I ) )//正确,QByteArray内容qDebug ) ) data[i]; ) 4、对probuf的写入假设生成的probuf中有以下2个重载函数

inlinevoidfirmwareinfo :3360 set _ firmware file (const char * value ) Google_dcheck ) value!=nullptr; firmware file _.setnoarena (:3360 Google :3360 proto buf : internal 33603360 getemptystringalreadyinited )、 //@ protoc _ insertion _ point (field _ set _ char : firmware info.firmware file ) } inlinevoidfirmwareinfo 3360333333330 size _ tsize (firmware file _.setnoarena ) :3360谷歌33603360 proto buf 33603:界面0: STD : string (reinterpret _ castconstchar * (value ),size ); //@如果要将包含protoc _ insertion _ point (field _ set _ pointer : firmware info.firmware file )0x00的char数组放入probuf中

firmware info * firmware info=newfirmwareinfo (; firmware info-set _ firmware file (send buffer,length ); //如果length以数组大小调用第一个过载函数,则只能在probuf中写入0x00之前的数据,0x00之后的数据将丢失

5、char * qbytearrayqbytearrayba=firmware file.read all (; char * data buffer=new char [ ba.size () ]; memcpy(databuffer,ba.data ),ba.size ); //方法1 :指定长度qbytearraysenddata=qbytearray (数据缓冲器,ba.size ) ); //正确//方法2:qbytearraysenddata=q bytearray (data buffer ); //错误,sendData只包含0x00之前的数据6,套接字发送

对于tcp通信,没有特殊要求,可以正确写入缓冲区

方法1:intfd=tcpconnect-write (send data ); //正确方法2:intfd=tcpconnect-write (send data,sendData.length ) ); //正确

总结:指定数据长度对处理包含大量0x00的数据很重要!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。