gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:41:06 25 4
gpt4 key购买 nike

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

我意识到在图像的第五个十六进制上,它是 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);
}

最佳答案

buffer 是一个 char *,指向 char 的指针,因此您可以获取机器上指针的大小(4 个字节,您运行在 32 位上) ,对吗?)。

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

0x00 只是 C 中字符串的分隔符,在本例中不相关。

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

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

关于无法读取 jpeg 二进制数据,缓冲区只有 4 个字节的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com