【转】从QDataStream向QByteArray中写入数据时的注意点(QT)

最近发现从QDataStream向QByteArray中写入数据常常是写不进去的,通过查看QT的源码:

QDataStream &operator>>(QDataStream &in, QByteArray &ba){    ba.clear();    quint32 len;    in >> len;    if (len == 0xffffffff)        return in;

const quint32 Step = 1024 * 1024;    quint32 allocated = 0;

do {        int blockSize = qMin(Step, len - allocated);        ba.resize(allocated + blockSize);        if (in.readRawData(ba.data() + allocated, blockSize) != blockSize) {            ba.clear();            in.setStatus(QDataStream::ReadPastEnd);            return in;        }        allocated += blockSize;    } while (allocated < len);

return in;}

发现原来其中有一句:


1

if (in.readRawData(ba.data() + allocated, blockSize) != blockSize) {

它检查读入的数据是不是整数个blockSize,如果不是,那么下面它会将QByteArray清空:


1

ba.clear();

所以如果想从QDataStream读入数据岛QByteArray中,可以采用下面的方法:

QDataStream &operator>>(QDataStream &in, QByteArray &ba){    ba.clear();    quint32 len;    in >> len;    if (len == 0xffffffff)        return in;

const quint32 Step = 1024 * 1024;    quint32 allocated = 0;

do {        int blockSize = qMin(Step, len - allocated);        ba.resize(allocated + blockSize);        if (in.readRawData(ba.data() + allocated, blockSize) < blockSize) {            return in;        }        allocated += blockSize;    } while (allocated < len);

return in;}

最后回过头来看一下将QByteArray写入QDataStream的方法

QDataStream &operator<<(QDataStream &out, const QByteArray &ba){    if (ba.isNull() && out.version() >= 6) {        out << (quint32)0xffffffff;        return out;    }    return out.writeBytes(ba, ba.size());}

其实是将QByteArray中所有的数据都写入QDatStream中,并没有扩展QByteArray的大小到blockSize,

所以针对这种情况,我们在使用QDataStream向QByteArray中读写数据的时候,需要手动将QByteArray

扩展到blockSize(1024*1024)大小。

原文地址:https://www.cnblogs.com/h2zZhou/p/10207409.html

时间: 2024-11-08 13:58:06

【转】从QDataStream向QByteArray中写入数据时的注意点(QT)的相关文章

向post请求中写入数据,最终保存在了HttpWebRequest.Params中

一.向post请求中写入数据,最终保存在了HttpWebRequest.Params中: 1)如果存入的是IDictionary类型的字符串变量,如:“username=administrator”,则key=value: 2)如果写入的是string类型的变量,如"username",则key=null,value=username: protected void btnLogin_Click(object sender, EventArgs e) { string Url = &q

计算机二级-C语言-程序填空题-190117记录-对文件的处理,复制两个文件,往新文件中写入数据。

//给定程序的功能是,调用函数fun将指定源文件中的内容赋值到指定目标文件中,复制成功时函数返回1,失败时返回0,把复制的内容输出到终端屏幕.主函数中源文件名放在变量sfname中,目标文件名放在变量tfname中. //重难点:对文件的处理.如何判断文件是否达到末尾,如何往文件中写入数据. 1 #include <stdio.h> 2 #include <stdlib.h> 3 int fun(char *source, char *target) 4 { FILE *fs,*f

POI向Excel中写入数据及追加数据

import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.*; import java.util.ArrayList; import java.

QT: QByteArray储存二进制数据(包括结构体,自定义QT对象)

因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类 1. 利用memcpy拷贝内存数据 //自定义person结构体 Cpp代码   typedef struct { int age; char name[20]; }Person; //向QByteArray写入多个结构体 void writeStruct() { QByteArray ba; ba.resize(2*sizeof(Pers

android 修改listview中adapter数据时抛出异常java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification问题

近日在做项目时遇到非必现crush,具体异常信息为: // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not mo

在Oracle中更新数据时,抛出:ORA-01008: not all variables bound

在Oracle中更新数据时,抛出了一个 :ORA-01008 not all variables bound, 我的理解是不是所有的变量/参数都有边界,不懂: 后来知道了,原来是“不是所有变量/参数都确定”, 就是有些变量没有指定,缺少变量参数, 最后发现是因为在写三层时少写了一个"new OracleParameter(":ID",userinfo.ID);" 导致的.

java实现赋值excel模板,并在新文件中写入数据,并且下载

/** * 生成excel并下载 */ public void exportExcel(){ File newFile = createNewFile(); //File newFile = new File("d:/ss.xls"); //新文件写入数据,并下载***************************************************** InputStream is = null; HSSFWorkbook workbook = null; HSSFSh

lua向文件中写入数据,进行记录

function readfile(path) local file = io.open(path, "r") if file then local content = file:read("*a") io.close(file) return content end return nil end function writefile(path, content, mode) mode = mode or "w+b" local file = i

Python向excel中写入数据的方法 方法简单

最近做了一项工作需要把处理的数据写入到Excel表格中进行保存,所以在此就简单介绍使用Python如何把数据保存到excel表格中. 数据导入之前需要安装 xlwt依赖包,安装的方法就很简单,直接 pip install xlwt ,如果电脑中安装过就不需要重复安装. 接下来就做一个简单的demo ,把三行数据添加到excel中. 具体代码如下: #!/usr/bin/env python # coding=utf-8 from xlwt import * #需要xlwt库的支持 #import