dat文件,在Windows中大量存在,到处都有。如下图edge浏览器安装目录下就有一个dat文件,如果你强行打开,发现它是乱码的。
一、什么是dat文件
DAT 文件格式只是一种通用格式,它在文件中包含任何类型的数据,它可能包含二进制或文本格式的数据,通常以 .dat 扩展名保存。
通常不能说某个特定的软件或程序负责创建 DAT 文件,这些文件仅由创建它们的应用程序特别访问。
备注:通常都是二进制,优势是体积小,不被轻易修改,各个语言都能通用;
二、Qt内相关概念
Qt 使用 QFile 和QDataStream 进行二进制数据文件的读写。QFile 负责文件的 IO 设备接口,即与文件的物理交互,QDataStream 以数据流的方式读取文件内容或写入文件内容。
QDataStream类实现了 C++ 基本数据类型的序列化,如char
、short
、int
、char *
等。更复杂数据的序列化是通过将数据分解为原始单元来完成的。有五个常用方法:
1.readRawData(char *s, int len)函数
该函数从流中最多读取len个字节到指针s指向的存储区域中并返回读取的字节数;
它会读取 len 个字节的数据,并且保存到指针s 指向的存储区
2. writeRawData (const char * s , int len )函数
将len个字节从s写入流。返回实际写入的字节数,如果出错则返回 -1;
它将会向文件流连续写入len 个字节的数据,这些字节数据保存在指针 s 指向的起始地址里;
3.writeBytes (const char * s , uint len )函数
写入字符串时:其中参数s 是一个指向字节型数据的指针,len 是字节数据的长度。
writeBytes在写入数据时,会先将len 作为一个 quint32类型写入数据流,然后再写入len 个从指针s 获取的数据。writeBytes()适合于写入字符串数据,因为在写入字符串之前要先写入字符串的长度,这样在读取文件时,就能知道字符串的长度,以便正确读出字符串。
4.readBytes(char *&s, uint &len)函数
读取字符串时,使用readBytes(函数时,会先自动读取前4 个字节数据作为 quint32 的数据并赋值给 len 参数。
因为 len 是以引用方式传递的参数,所以,len 返回读取的数据的字节数。然后根据 len 的大小读取相应字节的数据,存储到指针 s 指向的存储区。
5.setByteOrder()字节序
在一些跨平台场景下,有时会涉及到大端字节序和小端字节序,如果不指定可能读取就会发生错误,它就有两个参数QDataStream::BigEndian和QDataStream::LittleEndian,注意读写保持一致就行。
备注:不是必须项,非跨平台可以不指定;
类似的还有魔术标签和版本号,这些其实都可有可无,特定场景使用;
QDataStream aStream(&aFile);
aStream.setByteOrder(QDataStream::LittleEndian);
以下为魔术标签和版本号,这些用了读写就得一致;
熟悉以上5个方法后,再结合QBytearray就可以应对读写了。
三、读写dat文件
3.1 写入字符串形式
bool MainWindow::WriteDatStrFile()
{
QFile aFile("D:/test.dat");
if(!aFile.open(QIODevice::WriteOnly))
{
return false;
}
QByteArray btArray;
QString str1="ab让世界爱上中国造cd";
QDataStream aStream(&aFile);
btArray=str1.toUtf8();
aStream.writeBytes(btArray,btArray.length());
aFile.close();
return true;
}
3.2 读取字符串形式
bool MainWindow::ReadDatStrFile()
{
QFile aFile("D:/test.dat");
if(!aFile.open(QIODevice::ReadOnly))
{
return false;
}
char* buf=NULL;
uint strLen;
QDataStream aStream(&aFile);
aStream.readBytes(buf,strLen);
aFile.close();
if(buf != NULL)
{
QByteArray btArray= QByteArray(buf,strLen);
qDebug()<<"read str="<<QString::fromUtf8(btArray);
delete buf;
buf=NULL;
}
return true;
}
readRawData和writeRawData就不举例了,在实际存储中dat文件,几乎可以存储所有文件格式,图片、音乐、视频等等,只有谁创建的才知道应该用什么格式去访问,否则是一大堆乱码。也许就如《黑客帝国》所说,我们认为的真实世界会不会就是高维世界生命体编写的代码