C语言异或及文件操作之疑惑

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

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

#include <stdio.h>

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字节。这点不明白。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值