C++ 二进制文件格式与基于文本的格式文件大小
我读到以二进制格式保存文件比以基于文本的格式保存文件更紧凑。但是我的二进制格式文件怎么会比基于文本的文件大呢 以下是我编写的函数的基础知识。两人都扫描了同一个目录。基于二进制的文件总是大几千字节 基于文本的:C++ 二进制文件格式与基于文本的格式文件大小,c++,linux,qt,file-io,binary,C++,Linux,Qt,File Io,Binary,我读到以二进制格式保存文件比以基于文本的格式保存文件更紧凑。但是我的二进制格式文件怎么会比基于文本的文件大呢 以下是我编写的函数的基础知识。两人都扫描了同一个目录。基于二进制的文件总是大几千字节 基于文本的: void oldSave(){ QFile file("sentry.dat"); QTextStream out(&file); file.open(QIODevice::WriteOnly); QDir dir = dirSelect;
void oldSave(){
QFile file("sentry.dat");
QTextStream out(&file);
file.open(QIODevice::WriteOnly);
QDir dir = dirSelect;
out << "Directory: " << dirSelect << endl;
//prepend directory from which scan was selected to begin from
out << QCryptographicHash::hash(hashFile.readAll(),
QCryptographicHash::Md5).toHex()
<< " : " << hashFile.fileName() << "\n";
void oldSave(){
QFile文件(“sentry.dat”);
QTextStream out(文件(&F);
打开(QIODevice::WriteOnly);
QDir dir=dirSelect;
out语句“以二进制格式保存文件比以基于文本的格式保存文件更紧凑”是没有意义的。毕竟,写入二进制文件会写入实例的确切大小,而输出文本文件的格式由您决定。问问自己,操作符是如何设置的。教程可以说明这个问题。请阅读该部分
ASCII和二进制文件之间的区别是什么
。此外,请重新考虑使用UTF-8(当然需要比ASCII更多的空间)而不是ASCII,您将了解大小的差异。查看toHex
方法。提示:将toHex
的输出分配给字符串,并使用调试器查看该字符串
toHex方法可能正在转换ASCII十六进制转换中的内部表示形式。例如,值0x25(1字节的内部表示形式)可能转换为0x30、0x78、0x32、0x35,这是“0”、“x”、“2”、“5”的ASCII代码。因此,将二进制文件扩展4倍(前面有“0x”)或2倍(没有“0x”).您确定知道每个文件的精确大小吗?根据您的文件查找器报告大小的方式,您可能会看到操作系统管理硬盘上数据块的方式有误。您可以尝试编写一个小程序来读取每个文件,并将字节数计入eof。您应该编写一个正确的文件。此外,请检查文件的内容e使用十六进制编辑器来了解数据是如何保存的,您应该看到差异。以二进制输出MD5的大小应该是字符串版本的一半。toHex
方法可以在ASCII十六进制转换中转换内部表示形式。例如,值0x25(1字节的内部表示形式)可以转换为0x30、0x78、0x32、0x35,这是“0”、“x”、“2”、“5”的ASCII码。因此,将二进制文件扩展4倍(前面有“0x”)或2倍(没有“0x”)ASCII是Unicode的一个子集,UTF-8编码相同字节的公共字符。因此,除非您在打包的7位结构中存储ASCII,否则所有可能的ASCII字符串与UTF-8中相同的字符串大小相同。@汤姆,谢谢,我忘记了这个细节(也不考虑这个特定的情况)。
void saveFile(){
QFile file("sentry.dat");
QDataStream out(&file);
file.open(QIODevice::WriteOnly);
QDir dir = dirSelect;
out << dirSelect;
out << QCryptographicHash::hash(hashFile.readAll(), QCryptographicHash::Md5)
<< hashFile.fileName();