所以我想读取JPEG以通过套接字将其发送到浏览器。 但是我一直在阅读JPEG中遇到问题。 我的代码:
FILE* fp = fopen(filename, "rb");
if( fp == NULL)
{
fp = fopen(FILE_404, "r");
} else
{
struct stat fst;
stat(filename, &fst);
unsigned char *blob;
blob = (unsigned char *)malloc(fst.st_size);
fread(blob, 1, fst.st_size, fp);
header->content = (unsigned char*)malloc(fst.st_size);
strcat(header->content, blob);
header->content[fst.st_size+1] = "\0";
header->content_len = fst.st_size;
}
但是当打印blob时得到的全部是:\377\330\377\340
虽然文件是:67165字节大。
我该怎么办?
答案 0 :(得分:1)
strcat(header->content, blob);
对二进制数据没有意义。 strcat()
适用于字符串。 @ouah
以下是未定义的行为,因为content[fst.st_size+1]
超出范围。
reader->content = (unsigned char*)malloc(fst.st_size);
...
header->content[fst.st_size+1] = ...
代码似乎想要向数组附加空字符'\0'
。添加指向字符串"0"
的指针是不一样的。 IAC,附加空字符不是解决方案。
header->content = (unsigned char*)malloc(fst.st_size);
....
// bad code
header->content[fst.st_size+1] = "\0";
在使用fread(blob, 1, fst.st_size, fp);
中的数据之前,请检查blob
的返回值。 @Lee Daniel Crocker还应该检查stat()
的返回值。
轻微:无需投射malloc()
返回。
// blob = (unsigned char *)malloc(fst.st_size);
blob = malloc(fst.st_size);
通过blob
fread()
的内容
size_t i;
for (i = 0; i<fst.st_size; i++) {
printf(" %02X", blob(i));
}