/* 1. 整个文件读进内存 */
FILE *fp = fopen("path.jpg", "rb");
if (!fp) { perror("fopen"); return 1; }
//fseek + ftell 对大于 2GB 的文件(在 32 位系统上 long 通常为 4 字节)会溢出,返回负值或截断
fseek(fp, 0, SEEK_END); //文件指针移动到末尾
long n = ftell(fp);//文件长度
fseek(fp, 0, SEEK_SET);//文件指针移动到开头
unsigned char *buf = malloc(n);
fread(buf, 1, n, fp);//全部读到内存
fclose(fp);
/* 2. 从尾向前找最后一个 FF D9 = EOI */
long eoi = -1;
for (long i = n - 1; i > 0; i--)
if (buf[i] == 0xD9 && buf[i - 1] == 0xFF) { eoi = i - 1; break; }
if (eoi < 0) { printf("没找到 EOI, 不是合法 JPEG\n"); return 1; }
/* 3. 打印 EOI 之后的字节 */
long tail_len = n - (eoi + 2);
printf("%s: %ld 字节, EOI@%ld, 尾部 %ld 字节\n", path, n, eoi, tail_len);
for (long i = 0; i < tail_len; i++) printf("%02X ", buf[eoi + 2 + i]);
printf("\n文本内容: %.*s\n", (int)tail_len, buf + eoi + 2);