C二进制文件的表示

C二进制文件的表示,c,linux,compression,binaries,C,Linux,Compression,Binaries,对于一个家庭作业,我创建了一个简单的压缩/解压程序,该程序利用了运行长度编码的简单实现。我已经让我的程序运行起来了;压缩和解压缩任何包含大量字符的文本文件(例如程序源代码)都可以完美地工作。作为一个实验,我试图压缩/解压压缩程序本身的二进制文件。这导致文件比原始二进制文件小得多,显然无法运行。是什么导致了数据丢失 我的假设是,它与二进制文件的表示方式有关,但我无法理解过去的情况。如果平台是linux(正如问题标记的那样),二进制模式和文本模式之间没有区别。所以不应该是这样;但即便如此,这些文件也

对于一个家庭作业,我创建了一个简单的压缩/解压程序,该程序利用了运行长度编码的简单实现。我已经让我的程序运行起来了;压缩和解压缩任何包含大量字符的文本文件(例如程序源代码)都可以完美地工作。作为一个实验,我试图压缩/解压压缩程序本身的二进制文件。这导致文件比原始二进制文件小得多,显然无法运行。是什么导致了数据丢失

我的假设是,它与二进制文件的表示方式有关,但我无法理解过去的情况。

如果平台是linux(正如问题标记的那样),二进制模式和文本模式之间没有区别。所以不应该是这样;但即便如此,这些文件也应该以二进制文件的形式打开

我怀疑您的问题在于程序将“\0”字符视为终止符(或特别地视为终止符),而不是有效数据。

如果平台是linux(如问题所标记的),二进制模式和文本模式之间没有区别。所以不应该是这样;但即便如此,这些文件也应该以二进制文件的形式打开

我怀疑您的问题在于程序将“\0”字符视为终止符(或特别视为终止符),而不是有效数据。

可能的问题:

  • 程序以文本模式打开二进制文件,这会损坏
    '\r'
    '\n'
    字节
  • 您的程序错误地处理零字节,将其视为字符串的结尾(
    '\0'
    ),而不是其自身的数据
  • 您的程序对数据字节使用
    char
    (实际上是
    signed char
    ),并且只正确地处理非负值(英文文本的ASCII字符是),但无法处理任意字符/字节值(可能是负值)
  • 你的程序某处有一个溢出,它只显示在大文件上
  • 您的程序还有一些其他与数据相关的错误
    • 可能的问题:

      • 程序以文本模式打开二进制文件,这会损坏
        '\r'
        '\n'
        字节
      • 您的程序错误地处理零字节,将其视为字符串的结尾(
        '\0'
        ),而不是其自身的数据
      • 您的程序对数据字节使用
        char
        (实际上是
        signed char
        ),并且只正确地处理非负值(英文文本的ASCII字符是),但无法处理任意字符/字节值(可能是负值)
      • 你的程序某处有一个溢出,它只显示在大文件上
      • 您的程序还有一些其他与数据相关的错误


      是否以二进制模式打开文件?二进制文件只是1和0的未格式化流s@NPE不,我的程序只是使用
      getchar()
      从输入读取。这不就是每次从文件8中获取位并返回它们的整数值吗?请给我们看一下您的代码。“我不能马上这样做”--那为什么还要麻烦发布您的问题呢?如果没有代码,任何人都只能猜测原因。是否以二进制模式打开文件?二进制文件只是1和0的未格式化流s@NPE不,我的程序只是使用
      getchar()
      从输入读取。这不就是每次从文件8中获取位并返回它们的整数值吗?请给我们看一下您的代码。“我不能马上这样做”--那为什么还要麻烦发布您的问题呢?如果没有代码,任何人都可以猜测原因是什么。在Linux上,二进制和文本模式是相同的…@BasileStarynkevitch这不是一成不变的。我们还没有被告知使用了什么编译器。文本模式与二进制模式的处理不依赖于编译器。它由标准库(
      libc
      libstdc++
      )完成;在Linux上,它们都同样处理二进制和文本w.r.t.EOL。@BasileStarynkevitch我可以有一个具有不同行为的不同库,这对于语言标准来说是可以的。但对于Linux标准基础来说,这是不可以的。在Linux上,二进制和文本模式是相同的…@BasileStarynkevitch这不是一成不变的。我们还没有被告知使用了什么编译器。文本模式与二进制模式的处理不依赖于编译器。它由标准库(
      libc
      libstdc++
      )完成;在Linux上,它们都同样处理二进制和文本w.r.t.EOL。@BasileStarynkevitch我可以有一个不同的库,具有不同的行为,这对于语言标准来说是可以的。但是对于Linux标准库来说是不可以的。