如何把一个文件内关于图片(jpeg格式)的内容解析出来

rwjlqn 2009-08-19 02:59:21
一个文件内包含三部分内容:开头是无关数据,然后紧跟着图片的数据,最后也是无关数据。无关数据的大小都不确定。图片是jpeg格式的 十六进制下查看图片是以ffd8开头,以ffd9结束的。现在问题就是如何确定图片的数据(开头和结束)。
(如果是像‘呐魄壬室釉罩棕仝忏溴骁’这样的乱码,我转成无符号的就能查看它的16进制,但是有一些像?.等之类的东西就不能了)
文件内容用ue打开后大体是:


SEND OK
HTTP/1.1 200 OK, Success
Content-length: 35431
Content-Type: application/vnd.wap.mms-message
Server: Resin/3.0.7
Date: Fri, 14 Aug 2009 07:04:04 GMT

寗?140000187816090814150436001 崘?81415043691000011411 ?J?剦€+8613522694830/TYPE=PLMN ?8613552426202/TYPE=PLMN 朼dgjm 妧弫唩悂?!硦<2001586996> 塧pplication/smil 儊陞gjmptw.txt 巊jmptw.txt gjmptw倧x瀰haha.jpg 巋aha.jpg ??JFIF ?C




?C

?<?" ?
?? } !1AQa"q2亼?#B绷R佯$3br?
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??
?? w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬? ? ? ?u蠌?贾瘹I麸=逴?o2尬郋O豢o?? 綱㈱Oq{椕懂熯?服薧{? S]C氠 庂腱o倜繸椗 儫kF襱^"英緰辙Y[铴餆遢N鎦??瑚c???簓璲硆鲝?駝
唑 涌?j庳y跥討}熘孵
G馃鈱簅嬳看⒁褰讲? 荠ZX綺稽K^葩=罗盁[哈蜒t[5O耻xV監-銅曛蔝糭?鎒I]>V鮶Y唟喞J妳.x栽嗔d遗Fw?)髾駎N刂S颾裪叛+靘NO黜緬?餙V痦緲驞趠C?Q闆,-⒓體軥珐.蛻;n芴箕E昗驵k?嫦鈄=?kjwmt慗簉?睐鱓S?Lㄍ光嬵/鳙?拇1Y燊聾麬 ¨T 郎?釥~  杏?郿奎U杲? /? ??? jB擶笞
?漇 % 猕 唩鴥 CN? 亽 馮琰撅>?妩鸖?⒖灴鴋??隉?/ G???uO?? 姡齏? ?鬻隽跎 /? 跓啸 聾麬 ¨T 郎?釥~  杏?郿奎U杲 /鬻雒 楍 鞳鑂婠z 釥~  杏?郿奎U鹦?鑙??_?楘璆?祟 韮氲?? & 鞳鑂婠z 釥~  杏?郿奎U鹦?鑙??_?忰Z忺 椵 ?譲/﨧 跓啸 聾麬 ¨T 郎?釥~  杏?郿奎U甑? /? ?鼪 ?+ 唩鴥 CN? 亽 馮聾麬 ¨T 郎?誮?簋_w l]岿7 jB晪??5嵇馃 E=~?忶uO?? 姢o従>昡$?よ?瓀.塍V攛f?鹹}啐?旁?y?/?n杆/W%'堫%r?Y<熆 臦_ 村楑???俉application/smil 侁卲res.smil ?<2001586996> <smil><head><layout><root-layout width="176" height="208"/><region id="Image" width="160" height="120" top="5" left="8" fit="meet"/><region id="Text" width="160" height="58" top="130" left="8" fit="scroll"/></layout></head><body><par dur="5000ms"><text region="Text" src="gjmptw.txt"/><img region="Image" src="haha.jpg"/></par></body></smil>
...全文
977 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
我能读懂了 结贴了。。。。谢谢wangyue(kakashi0309)
rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 kakashi0309 的回复:]
随便写了个测试 看看还行.

C/C++ code#define MAX_SIZE 1024*50int main(void)
{
unsignedchar chBuf[MAX_SIZE]= {0};
unsignedchar chBegin[2]= {0xFF,0xD8};
unsignedchar chEnd[2]= {0xFF,0xD9};int iLen=0;int iBegin=0;int iEnd=0;
FILE* fp= fopen("haha.jpg","rb+");if (fp!= NULL)
{
fseek(fp,0, SEEK_END);
iLen= ftell(fp);
fseek(fp,0, SEEK_SET);
fread(chBuf,1, iLen, fp);int ioffset=0;while (1)
{if (!memcmp(chBuf+ioffset, chBegin,2))
{
iBegin= ioffset;
}if (!memcmp(chBuf+ioffset, chEnd,2))
{
iEnd= ioffset;break;
}
ioffset+=2;
}

}
fclose(fp);

fp= fopen("test.jpg","wb");if (NULL!= fp)
{
fwrite(chBuf+iBegin,1, iEnd-iBegin+2, fp);
}
fclose(fp);return0;
}
[/Quote]



额真服了~~~~~~~~~~~ 额三天都没搞出来 你一会就搞定了~~



研究你的代码


谢谢~ 能大体告诉我你思路吗
kakashi0309 2009-08-19
  • 打赏
  • 举报
回复
随便写了个测试 看看还行.


#define MAX_SIZE 1024*50


int main(void)
{
unsigned char chBuf[MAX_SIZE] = {0};
unsigned char chBegin[2] = {0xFF, 0xD8};
unsigned char chEnd[2] = {0xFF, 0xD9};
int iLen = 0;
int iBegin = 0;
int iEnd = 0;
FILE* fp = fopen("haha.jpg", "rb+");
if (fp != NULL)
{
fseek(fp, 0, SEEK_END);
iLen = ftell(fp);
fseek(fp, 0, SEEK_SET);
fread(chBuf, 1, iLen, fp);
int ioffset = 0;
while (1)
{
if (!memcmp(chBuf+ioffset, chBegin, 2))
{
iBegin = ioffset;
}
if (!memcmp(chBuf+ioffset, chEnd, 2))
{
iEnd = ioffset;
break;
}
ioffset += 2;
}

}
fclose(fp);

fp = fopen("test.jpg", "wb");
if (NULL != fp)
{
fwrite(chBuf+iBegin, 1, iEnd-iBegin+2, fp);
}
fclose(fp);


return 0;
}
rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
我的程序是这样的:
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;
int main()
{
ifstream ifs;
ifs.open("haha.jpg", ios::in);
string str = "";
string connect = "";
char tt[1024*50];
char *pt = tt;
while(!ifs.eof())
{
ifs>>pt;
connect = connect + pt;
}
ifs.close();
//cout<<"connect: "<<connect<<endl;

connect = connect.substr(180, connect.length());

char temp[1024*50];
memcpy(temp, connect.c_str(), connect.length());
//cout<<"temp: "<<temp<<endl;


char arr[1024*50];
int i;
for(i = 0; temp[i]; ++i)
{
sprintf(arr + i*2, "%02X", (unsigned char)temp[i]);
}
cout<<endl;
cout<<"haha: "<<arr<<endl;
}
rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
怎么个转换有问题?

你将数据读入缓存,然后从头开始memcmp(buf,key,2);//key[]={0xff,0xd8}

[/Quote]

这个真有问题: 如果是一些像 ‘刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬’ 这样的字符转换时没有问题 但如果像 “” 这样的就转换有问题了
你用ue工具 打开一张图片后 你看一下ue里面能把一个符号(.)转换成好几个不同的16进制的
james_hw 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rwjlqn 的回复:]
引用 6 楼 kakashi0309 的回复:
  将文件数据读入缓冲区buffer  然后判断是否为FF D8  和 FF D9

将中间这块数据另外写入个文件

fread  fwrite  fseek 等函数




一开始我也这么想的 也是这么操作的  不过后来对数据转换成16进制的时候 有一些符号转换的有问题了 所以不好找到ffd8头了
[/Quote]

怎么个转换有问题?

你将数据读入缓存,然后从头开始memcmp(buf,key,2);//key[]={0xff,0xd8}
lcy853142 2009-08-19
  • 打赏
  • 举报
回复
C/C++开发交流群84683361
rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 findcsdn 的回复:]
这个文件是一个http请求的回答,你要解析的不是jpg图片,是http协议和html格式。

先把页面从http数据流里分离出来,去掉http头就行了, 然后把图像从html里分离出来。

Quote]
你说的很在理 我发送一个get请求后 服务器就把一些数据全部传送给我了 我把数据都全部存到一个文件里
问:页面如何从http数据流里分离
rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kakashi0309 的回复:]
  将文件数据读入缓冲区buffer  然后判断是否为FF D8  和 FF D9

将中间这块数据另外写入个文件

fread  fwrite  fseek 等函数


[/Quote]

一开始我也这么想的 也是这么操作的 不过后来对数据转换成16进制的时候 有一些符号转换的有问题了 所以不好找到ffd8头了
kakashi0309 2009-08-19
  • 打赏
  • 举报
回复
将文件数据读入缓冲区buffer 然后判断是否为FF D8 和 FF D9

将中间这块数据另外写入个文件

fread fwrite fseek 等函数

findcsdn 2009-08-19
  • 打赏
  • 举报
回复
这个文件是一个http请求的回答,你要解析的不是jpg图片,是http协议和html格式。

先把页面从http数据流里分离出来,去掉http头就行了, 然后把图像从html里分离出来。




rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 magipan 的回复:]
你先看看JPEG的文件格式呀,只靠开头和结尾的两个字节能保证准确么?
[/Quote]

我手动把文件里ffd8前的数据和ffd9后的数据删除后 就保存为.jpg格式的图片后 双击 就能看到图片了
magipan 2009-08-19
  • 打赏
  • 举报
回复
你先看看JPEG的文件格式呀,只靠开头和结尾的两个字节能保证准确么?
rwjlqn 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arnold9009 的回复:]
JPEG文件编/解码详解
http://blog.chinaunix.net/u1/51538/showart_430929.html
[/Quote]

我想解析一个包含jpeg图片的文件 现在还不想对jpeg图片进行解码
Arnold9009 2009-08-19
  • 打赏
  • 举报
回复

70,012

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧