问题描述
|
更新:
谢谢您的帮助,我知道了!我应该在使用时增加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);
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\",so it will need to be closed
}
else
{
if (flag==1) //There is an image opened
{
putc(input_char,output_file);
}
}
}
解决方法
首先,我认为使用
memmem(3)
函数进行完全重写会获得更大的成功(memmem(3)
是类似于strstr(3)
的GNU扩展,但对于任意内存,而不仅仅是C字符串。这并不困难如果尚未提供memmem(3)
,则可以编写自己的版本。)当然,如果嵌入的JPEG文件包含与这些标头字节匹配的数据,则使用“ 4”仍然是个问题。我不知道这是可能的,但我也不知道这是不可能的。小心。 :)
这个循环看起来很麻烦,但是随着时间的推移很难维护,这就是为什么我建议了一种完全不同的方法。但是,如果您致力于这种方法,请注意,您将多次复制标头字节。我希望输出文件的前几个字节实际上是::9ѭ―您还没有向前迈进ѭ10to来说明循环中的所有书面字符。
我认为如果替换以下代码,您的代码将更易于阅读和维护:
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);
(i++
是错误修复程序,因为您不会为每个字符向前移动i
;删除input_char
变量只是清除操作,因为我发现使用该变量比不使用它更难读取。)