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

Cannot read .jpg binary data, buffer only has 4 bytes of data

我的问题与 this one 几乎完全相同,但没有人回答。我正在尝试读取 .jpg 的二进制数据以在使用 C++ 的简单 Web 服务器上作为 HTTP 响应发送。下面是读取数据的代码。

FILE *f = fopen(file.c_str(),"rb");
if(f){
    fseek(f,0,SEEK_END);
    int length = ftell(f);
    fseek(f,0,SEEK_SET);
    char* buffer = (char*)malloc(length+1);
    if(buffer){
      int b = fread(buffer,1,length,f);
      std::cout << "bytes read: " << b << std::endl;
    }
    fclose(f);
    buffer[length] = '[=10=]';
    return buffer;
  }
  return NULL;

当请求图像并运行此代码时,fread() returns 读取了 25253 个字节,这似乎是正确的。但是,当我执行 strlen(buffer) 时,我只得到 4。当然,当图像试图显示时,这会在浏览器上产生错误。我也曾尝试手动将 HTTP 内容长度设置为 25253,但随后收到 curl 错误 18,表明传输提前结束(因为只存在 4 个字节)。

正如另一位发帖者在他们的问题中提到的那样,图像(我假设大多数 .jpg 图像)的第 5 个字节是 0x00,但我不确定这是否对保存到缓冲区有影响。

我已验证我正在加载的.jpg 图片在目录中,有效,并且在正常打开时可以正常显示。我还尝试了两种不同的加载二进制数据的方法,而且都只给出了 4 个字节,所以我真的很茫然。非常感谢任何帮助。

When the request for the image is made and this code runs, fread() returns 25253 bytes being read, which seems correct. However, when I perform strlen(buffer) I get only 4.

你的问题是:你读的是 binary 数据,而不是文本,这意味着像换行符或空字符这样的特殊字符不是指示文本结构的东西,它的简单数字。

strlen 是一个函数,用于计算除 '[=11=]'0 以外的字符数。然而,在像 jpeg 这样的二进制文件中,通常有十几个零,并且由于二进制 header 结构,位置 5 似乎总是有一个零,所以 strlen 将停在首先找到 return 4.

此外,您似乎对尝试将此“文本解释”jpeg 发送到 HTTP 服务器这一事实感到困惑。当然它会抱怨,因为你不能简单地将二进制数据作为文本在 HTTP 中发送,你要么对其进行编码,base64 很流行,要么设置内容长度 header。当然,您还必须通过设置正确的 MIME header.

来告诉 HTTP client/server 类型