Iphone 如何使用XOR加密音乐文件

Iphone 如何使用XOR加密音乐文件,iphone,c,Iphone,C,我想加密和解密10000字节的音乐文件。我使用了代码: if(file!=NULL && g!= NULL) { while(!feof(file)) { count++; char aByte; fread(&aByte, sizeof(char), 1, file); if (count <= 10000) { if (count % 2

我想加密和解密10000字节的音乐文件。我使用了代码:

if(file!=NULL && g!= NULL)  
{
    while(!feof(file))
    {
        count++;
        char aByte;
        fread(&aByte, sizeof(char), 1, file);
        if (count <= 10000)
        {
            if (count % 2 == 0)
            {
                if ((aByte ^ 'A') != EOF) aByte = aByte ^ 'A';
            }
            else 
            {
                if ((aByte ^ 'B') != EOF) aByte = aByte ^ 'B';
            }
        }
        fwrite(&aByte, sizeof(char), 1, g);
    }
}   
fclose(file);
if(file!=NULL&&g!=NULL)
{
而(!feof(文件))
{
计数++;
查阿拜特;
fread(&aByte,sizeof(char),1,file);

如果(count在检查
EOF
时不应执行XOR(顺便说一句,
fread
在其返回值中指示,而不是在其写入缓冲区的值中指示);仅当准备将字节写入文件时


另外,如果你想正确加密,你需要一个更长的密钥,而且这个密钥必须是任何不能解密的人都不知道的。

通过删除“加密”来测试你的文件处理能力。去掉下面几行

        if (count % 2 == 0)
        {
            if ((aByte ^ 'A') != EOF) aByte = aByte ^ 'A';
        }
        else 
        {
            if ((aByte ^ 'B') != EOF) aByte = aByte ^ 'B';
        }
你的档案和我的一模一样吗?我想不会。以下是一些原因

  • 该文件的长度超过10000字节——您在最后关闭该文件,所以我假设这些字节丢失了
  • 该文件少于10000字节——您没有检查EOF属性,因此看起来将写入一个额外的字节
  • 在这段代码中,count没有初始化——如果它在一次运行中是奇数,在另一次运行中是偶数,它就不会匹配。此外,它只是根据count的大小复制一个随机数的字节。也许它在其他地方初始化过
  • 您没有关闭g,因此无法确定它是否已刷新(fwrite可以写入缓冲区)
  • 更新:EOF不是文件中可以找到的字节,它是一些文件API函数(不是fread)使用的特殊返回值

    函数getchar()的定义如下:

      int getchar();
    
    它要么返回EOF,要么返回字符范围内的整数。如果是EOF,则表示您位于文件末尾。如果不是,则可以安全地将返回转换为字符。EOF的唯一规定是它不是有效的字符。getchar()返回整数,因为它可以返回任何字符(256个选项)+EOF,共257个无法用字符表示的选项


    如果查看fread(),您会发现它与chars没有任何关系。它需要缓冲区、记录大小和记录计数,并返回读取的字节数。您正好传入了sizeof(char)和1来获取一个字符。它不可能在该字符中存储EOF,因为EOF不是有效字符,它是一个int并且不适合。它使用的约定与getchar()不同。如果遇到EOF,它将返回一个小于请求的总字节数的数。在您的情况下,这是0。如果fread()返回0,请检查feof()和ferror()要了解您是到达文件末尾还是出现错误(两者都会导致fread返回的数字小于请求的数字)。

    您所说的“不工作”是什么意思?因为在运行加密2次后,文件无法运行(正在侦听).Sr.我不明白。但我检查EOF,因为我不想将EOF写入文件。如果带有键的字节xor产生EOF结果,我将将将字节写入文件。我只需删除
    feof()
    调用并在每次调用时检查
    fread
    的返回值。如果它返回零,则不再有数据,因此中断循环。while(!feof(file)).SR这种检查是不够的?如果您正确使用它就足够了,但是在您的特定情况下,最好只检查
    fread
    的返回值。这样,如果(aByte!=EOF)
    ,您就不必去
    if(aByte!=EOF)
    (这在任何情况下都不起作用,因为
    aByte
    必须是整数。)为了澄清上面的评论:您的问题似乎是在混合不同的(有效的)读取C中字节的方法。您应该选择一种——也许看看一些示例代码,只有在您能够正确地读取和写入字符后才添加XOR内容。