我想加密和解密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);
但代码不起作用。请帮忙!!!
答案 0 :(得分:2)
当您检查EOF
时,您不应该执行XOR(顺便说一下,fread
表示其返回值而不是它写入缓冲区的值;只有在准备要写入文件的字节时才会这样做。
此外,如果您想要正确加密密钥,则需要更长的密钥 - 并且任何不应该解密密钥的人都必须知道该密钥。
答案 1 :(得分:1)
通过删除“加密”来测试文件处理。拿出这些线
if (count % 2 == 0)
{
if ((aByte ^ 'A') != EOF) aByte = aByte ^ 'A';
}
else
{
if ((aByte ^ 'B') != EOF) aByte = aByte ^ 'B';
}
你的文件是完全相同的吗?我认为不会。以下是一些原因
更新:EOF不是您可以在文件中找到的字节,它是某些FILE API函数(非fread)使用的特殊返回值。
函数getchar()的定义如下:
int getchar();
它返回EOF或者在char范围内的int。如果它是EOF,则表示您位于文件的末尾。如果没有,您可以安全地将回报转换为char。 EOF的唯一规定是它不是有效的字符。 getchar()返回一个int,因为它可以返回任何char(256个选项)+ EOF,总共257个选项,无法在char中表示。
如果你看fread(),你会发现它与chars没有任何关系。它需要缓冲区,记录大小和记录计数,并返回读取的字节数。你碰巧传入sizeof(char)和1来获得一个char。它不可能在该char中存储EOF,因为EOF不是有效的char,它是一个int并且不适合。它不使用与getchar()相同的约定。如果遇到EOF,则返回的数字小于请求的总字节数。在你的情况下,那是0.如果fread()返回0,检查feof()和ferror()以查明你是否到达文件结尾或出错(两者都导致fread返回少于请求的数量) )。