c语言异或操作不能还原,C语言异或及文件操作之疑惑

异或,逻辑运算,运算规则为:T^F=T, T^T = F, F^F = F。并且有 a = b^c, b = a^c。

因此可以简单的利用该方法加密解密。我使用了如下的程序:

#include

const char c = 0x49;

int main(int argc, char *argv[])

{

FILE *f = NULL;

FILE *p = NULL;

char  a = 0;

char  b = 0;

f = fopen("text.txt", "r");

if (NULL == f)

{

printf("Error 1./n");

exit(0);

}

p = fopen("text1.txt", "w");

if (NULL == p)

{

fclose(f);

printf("Error 2./n");

exit(0);

}

while (fscanf(f, "%c", &a) != EOF)

{

b = c ^ a;

printf("%c -> %02X/n", a, b);

fprintf(p, "%c", b);

}

fclose(f);

fclose(p);

return 0;

}

这段程序使用的text.txt 仅为拥有14个字符“ABCDEFGHIJKLMN”的文件,运行过程中屏幕输出为:

A -> 08

B -> 0B

C -> 0A

D -> 0D

E -> 0C

F -> 0F

G -> 0E

H -> 01

I -> 00

J -> 03

K -> 02

L -> 05

M -> 04

N -> 07

这些都没有问题,但是输出的text1.txt有15个字节,使用UltraEdit查看16静止会发现在B之后C之前(即0B和0A之间出现了一个0D),虽然我知道Windows平台下 /r/n经常成对出现,但是我没有使用你你就不要出来嘛。

然后将上述程序修改一下,将text1中的内容再异或一次输出到text2中去,屏幕输出结果为:

08 -> A

0B -> B

0A -> C

0D -> D

0C -> E

0F -> F

0E -> G

01 -> H

00 -> I

03 -> J

02 -> K

05 -> L

04 -> M

07 -> N

可以看到并没有那个0D(本来应该是第三个)存在,并且text2.txt只有14个字节。

我没有明白这是什么原因,很神奇啊。

我在Ubuntu9.04 下边实验了一下,text文件就是15个字节,第一次运行的时候可以看到最后一个字符不是N而是/n(0A),因此生成的text1也有15bytes,从text1到text2也是,最后一个字节又被转换为0A了。这三个文件都是15字节。这点不明白。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值