使用C语言,我试图操作一些由openssl生成的文件,这些文件包含很多(非常)特殊的字符。但文件的末尾似乎被过早地检测到了。例如,看到我的程序的摘录,它应该将一个文件复制到另一个:
(为了简单起见,我不显示文件打开的测试,但我在我的程序中这样做)
char msgcrypt[FFILE];
FILE* fMsg = fopen(f4Path,"r");
while(fgets(tmp,FFILE,fMsg) != NULL) strcat(msgcrypt,tmp);
fclose(fMsg);
FILE* fMsg2 = fopen(f5Path,"w");
fprintf(fMsg2,"%s",msgcrypt);
fclose(fMsg2);
这是位于f4Path:的文件的内容
Salted__X¢~xÁïÈú™xe^„fl¯�˜<åD
现在是位于f5路径的文件的内容:
Salted__X¢~xÁïÈú™xe^„fl¯
请注意,缺少4个字符。
有人有主意吗?
但是文件的末尾似乎被过早地检测到了
听起来很熟悉。
- 打开文件时使用
fopen(f4Path, "rb")
。这在Windows上具有真正的意义 - 不要使用字符串函数(
fprintf
、strcat
、fgets
等),它们会阻塞NUL
字符。请改用fread
和fwrite
strcat
尝试复制一个nul终止的char *
。这意味着,如果它遇到一个0,它可能已经在这里完成了,它将停止复制。
您最好使用open
read
、memcpy
和write
。
它停止的那个字符我复制到了一个十六进制编辑器中,如果我没有弄错的话,它最终是EF BF BD,一个BOM。因此,将文件作为文本文件读取失败。我看不到任何NULL字符(除非复制和粘贴去掉了它们)。
答案(正如已经讨论过的)是不要将其视为文本文件,避免使用str函数也不会造成任何伤害。
不过,我要做的第一件事是添加一个检查字符的读取方式,这样你就可以知道数据被截断的位置。现在它可以是任何一种:read,strcat,write。