我使用C中的偏移密码加密了一个文本文件。为此,我只为每个字符添加了128,并使文件大小减少了3个字节。我在其他一些文件上也尝试过相同的结果,即获得相同的结果,即文件大小减少3个字节。解密后我得到了原始大小。
你能告诉我为什么会这样吗?
主要逻辑的代码如下:
while((ch=fgetc(fs))!=EOF){
fputc(ch+128, ft);
答案 0 :(得分:3)
你能告诉我为什么会这样吗?
你的ch
可能有错误的声明。 fputc()
函数返回int
,而不是char
,如果转换为char
,您将失去(char) 0xff
和EOF
之间的区别
// 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
。