如果我使用一个字符长键一切正常,但如果我使用更长的键,程序崩溃。 对于此输入:'2A282E2A282E' 应输出:'aaaaaa'
#include <stdio.h>
#define KL 3
main()
{
unsigned char ch;
FILE *fpIn, *fpOut;
int i;
unsigned char key[KL] = {0x4B, 0x49, 0x4F};
fpIn = fopen("ctext.txt", "r");
fpOut = fopen("dtext.txt", "w");
i=0;
while(fscanf(fpIn, "%02X", &ch) != EOF)
{
fprintf(fpOut, "%c", ch ^ key[i % KL]);
i++;
}
fclose(fpIn);
fclose(fpOut);
return(0) ;
}
答案 0 :(得分:1)
当我使用GCC编译您的程序时,我会收到警告&#34;格式&#39;%X&#39;期望类型&#39; unsigned int *&#39;的参数,但参数3的类型为&#39; unsigned char *&#39;&#34;。这是一个可能导致崩溃的错误,因为char通常是一个字节宽,而int通常是四个字节。 fscanf将尝试在您的单字节空间中放置四个字节的数据,愉快地覆盖之后的任何数据。
正如BLUEPIXY在评论中建议的那样,您只需将<FooterTemplate[\r\s\S]+?</FooterTemplate>
替换为unsigned char ch
。
除此之外,它在我尝试时有效,除了你应该检查来自fopen的返回值之外,我没有看到其他明显的问题。
答案 1 :(得分:0)
我必须阅读&#39;%c&#39;没有&#39;%02X&#39;并将字符转换为十六进制值。 最终的代码解决了:
#include <stdio.h>
#define KL 3
int ctox(char c) //this is the convertin part
{
if(c>='0'&&c<='9') return c-'0';
return 10+c-'A';
}
main()
{
unsigned char ch, c1, c2;
FILE *fpIn, *fpOut;
int i=0;
unsigned char key[KL] = {0x4B, 0x49, 0x4F} ;
fpIn = fopen("ctext.txt", "r");
fpOut = fopen("dtext.txt", "w");
while(fscanf(fpIn, "%c%c", &c1, &c2) != EOF) //the read in part corrected
{
ch = 16*ctox(c1) + ctox(c2);
printf("HEX %c%c ", c1, c2);
printf("DEC %3d ", ch); // this three line just for examination
printf("i %d\n", i);
fprintf(fpOut, "%c", ch^key[i % KL ] ) ;
i++;
}
fclose(fpIn);
fclose(fpOut);
return(0) ;
}
谢谢你们所有人。