Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二进制文件格式与基于文本的格式文件大小_C++_Linux_Qt_File Io_Binary - Fatal编程技术网

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();