更新: 谢谢你的帮助,我想通了!当我使用
时,我应该增加i putc(input_char, output_file);
input_char = chars[i+1];
putc(input_char, output_file);
input_char = chars[i+2];
putc(input_char, output_file);
input_char = chars[i+3];
putc(input_char, output_file);
我有一个包含几个jpeg图像的文件。我需要将每个图像放在一个单独的文件中。我已经将文件放入:
unsigned char* chars;
我认为:
chars = (unsigned char*) malloc (sizeof(unsigned char)*count+1);
(count是总字节数)
这是我代码的很大一部分。在我浏览整个文件之前,我试图让一个图像工作。我认为这会起作用,但我无法获得图像。我得到一个名为image.jpg的文件,里面有很多字节,但没有图片。似乎文件的开头是错误的,但我不确定。任何建议或提示将不胜感激。提前致谢。
FILE* output_file;
unsigned char input_char;
for(i=0; i <=count-3 && flag2==0; i++)
{
input_char = chars[i];
if ((chars[i] == 0xff ) &&
(chars[i+1] == 0xd8) &&
(chars[i+2] == 0xff) &&
(chars[i+3] == 0xe0))
{
if (flag==1) {
puts("closing file I");
fclose(output_file);
puts("closed I");
flag2 = 1;
break;
}
pictures++;
puts("New pic! I");
puts("Opening file I!");
output_file = fopen("image.jpg", "wb");
putc(input_char, output_file);
input_char = chars[i+1];
putc(input_char, output_file);
input_char = chars[i+2];
putc(input_char, output_file);
input_char = chars[i+3];
putc(input_char, output_file);
flag = 1;//there is at least one image, so it will need to be closed
}
else if ((chars[i] == 0xff) &&
(chars[i+1] == 0xd8) &&
(chars[i+2] == 0xff) &&
(chars[i+3] == 0xe1))
{
if (flag==1) {
puts("closing file II");
fclose(output_file);
puts("closed II");
flag2 = 1;
break;
}
pictures++;
puts("New pic II!");
puts("Opening file! II");
output_file = fopen("Image.jpg", "wb");
putc(input_char, output_file);
input_char = chars[i+1];
putc(input_char, output_file);
input_char = chars[i+2];
putc(input_char, output_file);
input_char = chars[i+3];
putc(input_char, output_file);
flag = 1;//there is at least one image, so it will need to be closed
}
else
{
if (flag==1) //There is an image opened
{
putc(input_char, output_file);
}
}
}
答案 0 :(得分:1)
首先,我认为使用memmem(3)
函数进行完全重写会有更大的成功(memmem(3)
是一个GNU扩展,如strstr(3)
,但对于任意内存,而不仅仅是C字符串。如果memmem(3)
尚不可用,那么编写自己的版本并不困难。)。当然,如果嵌入的JPEG文件包含与这些头字节匹配的数据,则使用memmem(3)
仍然会成为问题。我不知道这是可能的,但我也不知道这是不可能的。小心。 :)
这个循环看起来只是随着时间的推移而保持麻烦,这就是为什么我提出了一种完全不同的方法。但是如果你致力于这种方法,请注意你将复制你的标题字节几次次;我希望输出文件的前几个字节实际上是:0xff 0xd8 0xff 0xe0 0xd8 0xff 0xe0
- 您还没有将i
转发到您的循环中的所有书写字符。
我认为如果替换此代码,您的代码将更易于阅读和维护:
putc(input_char, output_file); input_char = chars[i+1]; putc(input_char, output_file); input_char = chars[i+2]; putc(input_char, output_file); input_char = chars[i+3]; putc(input_char, output_file);
使用此代码:
putc(chars[i++], output_file);
putc(chars[i++], output_file);
putc(chars[i++], output_file);
putc(chars[i++], output_file);
(i++
是错误修正,因为你没有为每个字符移动i
;删除input_char
变量只是清理,因为我发现使用变量读取比没有变量更困难。)