C二进制文件的表示
对于一个家庭作业,我创建了一个简单的压缩/解压程序,该程序利用了运行长度编码的简单实现。我已经让我的程序运行起来了;压缩和解压缩任何包含大量字符的文本文件(例如程序源代码)都可以完美地工作。作为一个实验,我试图压缩/解压压缩程序本身的二进制文件。这导致文件比原始二进制文件小得多,显然无法运行。是什么导致了数据丢失 我的假设是,它与二进制文件的表示方式有关,但我无法理解过去的情况。如果平台是linux(正如问题标记的那样),二进制模式和文本模式之间没有区别。所以不应该是这样;但即便如此,这些文件也应该以二进制文件的形式打开 我怀疑您的问题在于程序将“\0”字符视为终止符(或特别地视为终止符),而不是有效数据。如果平台是linux(如问题所标记的),二进制模式和文本模式之间没有区别。所以不应该是这样;但即便如此,这些文件也应该以二进制文件的形式打开 我怀疑您的问题在于程序将“\0”字符视为终止符(或特别视为终止符),而不是有效数据。可能的问题:C二进制文件的表示,c,linux,compression,binaries,C,Linux,Compression,Binaries,对于一个家庭作业,我创建了一个简单的压缩/解压程序,该程序利用了运行长度编码的简单实现。我已经让我的程序运行起来了;压缩和解压缩任何包含大量字符的文本文件(例如程序源代码)都可以完美地工作。作为一个实验,我试图压缩/解压压缩程序本身的二进制文件。这导致文件比原始二进制文件小得多,显然无法运行。是什么导致了数据丢失 我的假设是,它与二进制文件的表示方式有关,但我无法理解过去的情况。如果平台是linux(正如问题标记的那样),二进制模式和文本模式之间没有区别。所以不应该是这样;但即便如此,这些文件也
- 程序以文本模式打开二进制文件,这会损坏
和'\r'
字节'\n'
- 您的程序错误地处理零字节,将其视为字符串的结尾(
),而不是其自身的数据'\0'
- 您的程序对数据字节使用
(实际上是char
),并且只正确地处理非负值(英文文本的ASCII字符是),但无法处理任意字符/字节值(可能是负值)signed char
- 你的程序某处有一个溢出,它只显示在大文件上
- 您的程序还有一些其他与数据相关的错误
- 程序以文本模式打开二进制文件,这会损坏
和'\r'
字节'\n'
- 您的程序错误地处理零字节,将其视为字符串的结尾(
),而不是其自身的数据'\0'
- 您的程序对数据字节使用
(实际上是char
),并且只正确地处理非负值(英文文本的ASCII字符是),但无法处理任意字符/字节值(可能是负值)signed char
- 你的程序某处有一个溢出,它只显示在大文件上
- 您的程序还有一些其他与数据相关的错误
- 可能的问题:
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标准库来说是不可以的。