使用偏移密码加密后,为什么文件大小会减小?

时间:2014-01-04 04:01:30

标签: c file encryption file-io

我使用C中的偏移密码加密了一个文本文件。为此,我只为每个字符添加了128,并使文件大小减少了3个字节。我在其他一些文件上也尝试过相同的结果,即获得相同的结果,即文件大小减少3个字节。解密后我得到了原始大小。

你能告诉我为什么会这样吗?

主要逻辑的代码如下:

while((ch=fgetc(fs))!=EOF){
         fputc(ch+128, ft);

2 个答案:

答案 0 :(得分:3)

  

你能告诉我为什么会这样吗?

你的ch可能有错误的声明。 fputc()函数返回int,而不是char,如果转换为char,您将失去(char) 0xffEOF之间的区别

// WRONG WRONG WRONG
// char ch = fgetc(fs);

正确的声明:

int ch = fgetc(fs);

否则,不应该发生。您的流程是否干净利落?如果您abort(),则FILE *个缓冲区中可能仍有数据。显示更多代码。与Valgrind一起运行。检查流程的退出状态。

  

我认为文件大小应该加倍,因为加密后一个字符占用了两个字节,因为大于127的字节不能存储在1个字节中。

不,fputc()不起作用。 fputc()手册页(在终端中运行man fputc,除非在Windows上):

  

fputc()将角色c,投射到unsigned char,写入stream

转换为unsigned char是通过取值模数256 * 来完成的。所以fputc()总是只写一个字节的数据(除非它失败)。

* 除了极为罕见的系统之外,这是真的。

答案 1 :(得分:2)

如果你谈论Windows,我可以想象你已经在文本模式下打开了文件,而不是二进制模式。

这导致以下结果:

  • \n会导致\r\n写入文件。
  • 从文件中读取\r\n仅向用户提供\n
  • 阅读在第一个\x1A停止,是一个EOF角色。

如果为每个字节添加128,则要写入的数据将在256处翻转。虽然使用值>调用fputc()可能是未定义的行为。 256(您应该写(ch+128)%256(ch+128) & 0xFF),在您的系统上,它显然会写入由256包裹的值,因此您可能会偶然得到\n\x1A