无法读取jpeg二进制数据,缓冲区只有4个字节的数据

时间:2014-01-21 16:32:36

标签: c buffer jpeg fread

我正在尝试读取JPEG文件并将其作为HTTP POST请求标头的一部分存储在C中的缓冲区中,然后使用HTTP POST上传到服务器。但似乎它只读取图像数据的前4个字节,因为在服务器端我只获得图像的前4个十六进制字符。我的代码出了什么问题?操作系统是LINUX。

我意识到在IMAGE的第五个HEX上,它的0x00,我认为C将其解释为终结符,或者它只是认为文件在这里停止...如何避免这个问题?

unsigned long fileLen;
char *buffer;

if ((fp = fopen(filename, "rb")) == NULL){
    printf("File could not be opened\n");
    exit(1);
}else{
     fseek(fp, 0, SEEK_END);
     fileLen=ftell(fp);
     fseek(fp, 0, SEEK_SET);
     buffer=(char *)malloc(fileLen);
     fread(buffer, fileLen, 1, fp);
     fclose(fp);
}

1 个答案:

答案 0 :(得分:0)

buffer是一个char *,指向一个char的指针,所以你得到你机器上指针的大小(4个字节,你运行的是32位,对吧?)。

fread的返回值是读取的字节数,我建议你使用它。

0x00只是C中字符串的分隔符,在这种情况下不相关。

顺便说一下,您可能希望考虑输入一些错误处理。如果ftell失败,则返回-1,然后在malloc中使用。然后这将失败并返回NULL,您将在fread中将其用作第一个参数。这会给你一个SIGSEGV分段违规,即你的程序崩溃。

编辑:如果你有一个非常大的文件,可能是另一个问题。您寻求文件结束以获取其大小(请考虑使用fstat),但如果文件大小超过最大堆大小,该怎么办?例如一个2千兆字节的文件?这将导致malloc失败并返回NULL。