Heim > Fragen und Antworten > Hauptteil
Nach erfolgreicher Ausführung der fread-Funktion ist der zurückgegebene Wert gleich data_len. Aber nach der Ausführung von strlen ist die Länge des String-Buffs falsch. Aber ich habe fwrite verwendet, um das Bild in eine andere JPG-Datei zu schreiben, und es war in Ordnung
int main()
{
FILE *fp,*out;
int c,len;
out=fopen("out.jpg","wb");
if((fp=fopen("/home/jens/Desktop/picture.jpg","rb"))<0){
printf("error open\n");
}
if(fp == NULL)
printf("Open file Error!");
fseek(fp,0,SEEK_END);
int data_len=ftell(fp);
printf("datalen %d",data_len);
rewind(fp);
char* buff=(char *)malloc((data_len)*sizeof(char)+1);
size_t a=fread(buff,sizeof(char),data_len,fp);
printf( "\n a %d",a); //a的值是图片的大小
len=strlen(buff);
printf("\n len %d",len);//在这里buff的大小却只是4。
char* HTTP_INFO=(char *)malloc((data_len)*sizeof(char)+1024);
char *buf="abcdefg";
printf("\n %d",strlen(buf));
len=sprintf(HTTP_INFO,"%s",buf);//如果把这个换成buff,结果也还是4。
printf("\nlen %d",len);
fclose(fp);
fclose(out);
return 0;
}
Das Laufergebnis ist wie unten dargestellt
滿天的星座2017-06-07 09:26:30
strlen
的作用是遍历一个char*
,如果找到0x00
(所谓结束符'\0'
)就认为字符串结束,并返回遍历了多少个字符。你读取一个jpg文件,有很大概率在第5个字节上出现0x00,那么strlen当然只能读到4个字节。不信你可以用xxd out.jpg
看一下二进制字节。
伊谢尔伦2017-06-07 09:26:30
C语言吧\0
看作字符串的结尾。。。
简单来说,strlen
的实现大概是:
int strlen(char *p){
int c=0;
while(*(p++)) c++; // p[c] != 0
return c;
}
而 rb
读取出来的结果可以认为是uint8
的数组,即0~255
的数组。
对于JPEG,你应该知道APP0
的第一个字段是本字段长度0x00,0x10