【问题标题】:Binary file format vs Text-based format file size二进制文件格式与基于文本的格式文件大小
【发布时间】:2014-06-01 16:32:18
【问题描述】:

我读到以二进制格式保存文件比以基于文本的格式保存文件更紧凑。但是我的二进制格式文件怎么比基于文本的文件大呢?

以下是我编写的函数的基础知识。两者都扫描了同一个目录。基于二进制的文件总是大几千字节。

基于文本:

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

【问题讨论】:

  • 您确定您知道每个文件的精确大小吗?根据您的文件查找器报告大小的方式,您可能会看到操作系统管理硬盘驱动器上数据块的方式的工件。您可以尝试编写一个小程序来读取每个文件并计算 eof 的字节数。
  • 你应该写一个正确的SSCCE。此外,使用十六进制编辑器检查文件的内容以了解数据的保存方式,您应该会看到差异。以二进制形式输出 MD5 的大小应该是字符串版本的一半。
  • toHex 方法可能会在 ASCII 十六进制转换中转换内部表示。例如,值 0x25(1 个字节的内部表示)可以转换为 0x30、0x78、0x32、0x35,即 '0'、'x'、'2'、'5' 的 ASCII 码。因此将二进制文件扩展 4 倍(前面有“0x”)或 2 倍(没有“0x”)。

标签: c++ linux qt file-io binary


【解决方案1】:

“以二进制格式保存文件比以基于文本的格式保存文件更紧凑”的说法毫无意义。毕竟,写入二进制文件会写入实例的确切大小,而您决定输出文本文件的格式。问问自己,operator&lt;&lt;()QDirQTextStream 上是如何定义的?

除非输出的二进制文件异常大,否则如果输入和输出工作正常,您不必担心文件大小会略有增加。

【讨论】:

    【解决方案2】:

    可能是this教程对这个问题进行了说明。请阅读该部分

    ASCII 文件和二进制文件的区别?

    。此外,再考虑一下 UTF-8(当然比 ASCII 需要更多的空间)而不是 ASCII,你就会明白大小的差异。

    【讨论】:

    • ASCII 是 Unicode 的子集,而 UTF-8 用相同的字节编码常见字符。因此,除非您将 ASCII 存储在压缩的 7 位结构中,否则每个可能的 ASCII 字符串的大小都与 UTF-8 中的相同字符串相同。
    • @Tom,谢谢,我忘记了这个细节(也不考虑这个具体情况)。
    【解决方案3】:

    查看toHex 方法。提示:将toHex 的输出分配给一个字符串,并使用调试器查看该字符串。

    toHex 方法可能会在 ASCII 十六进制转换中转换内部表示。例如,值 0x25(1 个字节的内部表示)可以转换为 0x30、0x78、0x32、0x35,即 '0'、'x'、'2'、'5' 的 ASCII 码。从而将二进制文件扩展 4 倍(前面有“0x”)或 2 倍(没有“0x”)。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 2012-04-02
      • 2012-02-15
      • 2017-09-21
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多