mrp修改打包解包函数.php读取mrp

2011/12/12 13:07:00  人气 706    修改美化论坛  
1.文件头部分:
0-4文件类型
4-8MRP数据开始位置+8
8-12mrp文件总字节数
12-16MRP文件列表开始位置
16-28内部文件名
28-52显示名
52-68串号
68-72版本ID
72-76appid
76-88未知
88-128作者
128-192介绍
192-196版本ID十六进制值
196-200appid十六进制值
200-240未知
2.紧接着是文件列表部分:
下面以start.mrp介绍,每两位数为一字节,初始数据为:
0A00 0000 7374 6172 742E 6D72 7000 1C01 0000 8101 0000 0000 0000
开始2字节的值为文件名的长度加1:0A00=10 而文件名start.mrp的长度是9,在文件名后面加上一个

空字节等于10
文件名前2字节为空字节:0000
然后是文件名数据:7374 6172 742E 6D72 7000(注:所有的文件名在MRP中最后都加一个空字

节,即00)
后面紧跟2字节记录实际文件在MRP中的位置:1C01=284
然后又是2个空字节:0000
后面2字节记录实际文件的数据长度:8101=385
最后还有6个空字节:0000 0000 0000
由以上信息我们可以知道文件名为start.mrp的文件在MRP中的位置为284,长度为385,从MRP的284处

开始取数据一直取长度为385的 数据出来并保存为文件名是start.mrp.gz的文件,用winrar解压就

得到了从MRP中取出来的start.mrp文件。
3.文件列表过后是压缩文件数据部分:
在每个压缩文件数据之前还有一个文件信息头,下面以start.mrp介绍,每两位数为一字节,初始数

据为:
0A00 0000 7374 6172 742E 6D72 7000 8101 0000
可以看出这个文件信息头和文件列表的很相似,只是文件名后面不同,文件列表部分的数据在文件名

后面记录有实际文件的位置和实际文 件的数据长度,而在这里只记录有实际文件的数据长度:

8101,然后有2个空字节,之后就是实际文件的压缩数据了。
------------------
附上一份开发作者用php写的MRP信息内部修改及压缩解压函数,还没来得及封装成类。
dnmrp.php 用于读取并修改mrp信息
<?php
function binadd($$f,$$n)
{
while(strlen($$f)<$$n)
$$f=’0’.$$f;
$$f=substr($$f,0,$$n);
return $$f;
}
function gb2u0($$f)
{return mb_convert_encoding(str_replace(chr(0),’’,$$f),’utf-8’,’gb2312’);}
function u2gb0($$f,$$n)
{
$$f=mb_convert_encoding($$f,’gb2312’,’utf-8’);
for($$a=strlen($$f);$$a<=$$n;$$a++)
{$$f.=chr(0);}
$$f=substr($$f,0,$$n);
return $$f;
}
function getmrp($$f)
{
/*
参数:文件路径
返回一个包含mrp信息的数组(UTF-8编码)
*/
$$f=fopen($$f,’rb’);
if(fread($$f,4)!=’MRPG’)
{fclose($$f);
return false;}
fseek($$f,52,SEEK_SET);
$$ch=gb2u0(fread($$f,16));
fseek($$f,192,SEEK_SET);
$$bb=hexdec(bin2hex(fread($$f,4)));
fseek($$f,196,SEEK_SET);
$$id=hexdec(bin2hex(fread($$f,4)));
fseek($$f,16,SEEK_SET);
$$nn=gb2u0(fread($$f,12));
fseek($$f,28,SEEK_SET);
$$xn=gb2u0(fread($$f,24));
fseek($$f,88,SEEK_SET);
$$zz=gb2u0(fread($$f,40));
fseek($$f,68,SEEK_SET);
$$bb2=hexdec(bin2hex(strrev(fread($$f,4))));
fseek($$f,72,SEEK_SET);
$$id2=hexdec(bin2hex(strrev(fread($$f,4))));
fseek($$f,128,SEEK_SET);
$$js=gb2u0(fread($$f,64));
fclose($$f);
return array(
’id’=>$$id2.’&’.$$id,
’ch’=>$$ch,
’bb’=>$$bb2.’&’.$$bb,
’nn’=>$$nn,
’xn’=>$$xn,
’zz’=>$$zz,
’js’=>$$js);
}
function putmrp($$fn,$$v)
{
/*
参数:文件路径、包含要修改为的mrp信息的数组(与getmrp的结构相同)
返回一个包含mrp信息的数组(UTF-8编码)
*/
$$fp=fopen($$fn,’r+’);
if(fread($$fp,4)!=’MRPG’)
{return false;}
$$ch=u2gb0($$v[’ch’],16);
$$nn=u2gb0($$v[’nn’],12);
$$xn=u2gb0($$v[’xn’],24);
$$zz=u2gb0($$v[’zz’],40);
$$js=u2gb0($$v[’js’],64);
$$id=explode(’&’,$$v[’id’]);
$$id2=pack(’H*’,binadd(dechex($$id[0]),8));
$$id=pack(’H*’,binadd(dechex($$id[1]),8));
$$bb=explode(’&’,$$v[’bb’]);
$$bb2=pack(’H*’,binadd(dechex($$bb[0]),8));
$$bb=pack(’H*’,binadd(dechex($$bb[1]),8));
fseek($$fp,16);
fwrite($$fp,$$nn.$$xn.$$ch.strrev($$bb2).strrev($$id2));
fseek($$fp,88);
fwrite($$fp,$$zz.$$js.$$bb.$$id);
fclose($$fp);
return true;
}
?>
------------------
bmmrp.php 用于mrp文件解、打包(需要zlib扩展库支持)
<?php
function mrpgetlist($$f)
{
$$f=fopen($$f,’rb’);
if(fread($$f,4)!=’MRPG’)
return false;
$$r=240;
fseek($$f,4,SEEK_SET);
$$s=hexdec(bin2hex(strrev(fread($$f,4))));
for(;true;)
{
if($$r>$$s) break;
fseek($$f,$$r,SEEK_SET);
$$x=hexdec(bin2hex(fread($$f,1)));
$$r+=4;
fseek($$f,$$r,SEEK_SET);
$$n=fread($$f,$$x-1);
$$r+=$$x;
fseek($$f,$$r,SEEK_SET);
$$v=hexdec(bin2hex(strrev(fread($$f,4))));
$$r+=4;
fseek($$f,$$r,SEEK_SEK);
$$l=hexdec(bin2hex(strrev(fread($$f,4))));
$$r+=8;
$$list[]=array(’n’=>$$n,’v’=>$$v,’l’=>$$l);
}
fclose($$f);
return $$list;
}
function mrpunpack($$fname,$$dir,$$list=null)
{
$$f=fopen($$fname,’rb’);
if(fread($$f,4)!=’MRPG’)
return false;
if($$list==null) $$list=mrpgetlist($$fname);
mkdir($$dir);
foreach($$list as $$a)
{
$$j++;
fseek($$f,$$a[’v’],SEEK_SET);
#$$x=fread($$f,$$a[’l’]);
#$$a[’n’]=mrpcname($$a[’n’],$$dir);
file_put_contents(($$fn=“$$dir/$$j.$$a[n].txt“).’.gz’,fread($$f,$$a[’l’]));
$$gz=gzopen($$fn.’.gz’,’r’);
#$$gz2=gzread($$gz,10000000);
file_put_contents($$fn,gzread($$gz,10000000));
gzclose($$gz);
}
fclose($$f);
return $$list;
}
function mrppacklist($$list,$$gzip=3)
{
if($$gzip<1 or $$gzip>9)
$$gzip=3;
foreach($$list as $$a)
{
if(!file_exists($$a)) continue;
#$$af=file_get_contents($$a);
$$gz=gzopen($$a.“.gz“,“w“.$$gzip);
gzwrite($$gz,file_get_contents($$a));
gzclose($$gz);
$$al=filesize($$a.’.gz’);
$$na=eregi_replace(chr(94).’.*[\\/]([0-9]+\.)?(.[’.chr(94).’\\/]*)\.txt$$’,’\\2’,$$a);
#$$na=eregi_replace(’\([0-9]+\)$$’,’’,$$na);
$$n=strlen($$na)+1;
$$nn+=$$n;
$$lst[]=array($$na,$$a.’.gz’,$$al,$$n);
}
$$lstl=16*($$jc=count($$lst))+$$nn;
$$lst[0][]=$$lstl+248+$$lst[0][3];
for($$a=1;$$a<$$jc;$$a++)
$$lst[$$a][]=$$lst[$$a-1][4]+$$lst[$$a-1][2]+8+$$lst[$$a][3];
return $$lst;
}
function mrppack($$f,$$lst,$$mrp)
{
if(!function_exists(’binadd’)) include ’dnmrp.php’;
$$f=fopen($$f,’rb’);
if(fread($$f,4)!=’MRPG’)
return false;
fseek($$f,8,SEEK_SET);
$$fa=fread($$f,232);
fclose($$f);
$$x=chr(0);
foreach($$lst as $$a)
{
$$wz=strrev(pack(’H*’,binadd(dechex($$a[4]),8)));
$$cd=strrev(pack(’H*’,binadd(dechex($$a[2]),8)));
$$fl=pack(’H*’,binadd(dechex($$a[3]),2));
#$$x=chr(0);
$$filelist.=$$fl.$$x.$$x.$$x.$$a[0].$$x.$$wz.$$cd.$$x.$$x.$$x.$$x;
$$dat.=$$fl.$$x.$$x.$$x.$$a[0].$$x.$$cd.file_get_contents($$a[1]);
}
$$start=strrev(pack(’H*’,binadd(dechex($$lst[0][4]-$$lst[0][3]-16),8)));
file_put_contents($$mrp,“MRPG“.$$start.$$fa.$$filelist.$$dat);
return $$lst;
}
function mrpcname($$f,$$dir)
{
if(file_exists(“$$dir/$$f.txt“) or eregi(“\([0-9]+\)$$“,$$f))
$$g=true;
for($$a=0;$$g or file_exists(“$$dir/$$f($$a).txt“);$$a++)
{$$j=“(“.($$a+1).“)“;
$$g=false;}
return “$$f$$j“;
}
?>
------------------
dnmrp.php使用例程:mrpgai.php

<?php
include “mime.php“;
?><!DOCTYPE html PUBLIC “-//WAPFORUM//DTD XHTML Mobile 1.0//EN“

“http://www.wapforum.org/DTD/xhtml-mobile10.dtd“>
<html xmlns=“http://www.w3.org/1999/xhtml“>
<head>
<meta http-equiv=“Content-Type“ content=“<?php echo $$mime; ?>; ***set=<?php echo

strtolower($$html_code); ?>“/>
<?php include “css.php“; ?><title>mrp内部信息修改</title>
</head>
<body>
<p><a id=“top“ href=“#bottom“ accesskey=“6“></a>
<?php
$$d=$$_GET[’d’];
echo ’<a href=“read.php?id=mrpindex&d=’.$$d.’“>mrp高级修改</a><br/>’;
include ’dnmrp.php’;
if($$v=getmrp(“mrptmp/$$d.mrp“))
{
if(!$$_POST[’go’])
{ ?>
<form accept-***set=“utf-8“ action=“read.php?id=mrpgai&d=<?php echo $$d; ?>“

method=“post“>
应用id:<input type=“text“ name=“id“ value=“<?php echo str_replace(’&’,’&’,$$v[’id’]); ?

>“/><br/>
版本id:<input type=“text“ name=“bb“ value=“<?php echo str_replace(’&’,’&’,$$v[’bb’]); ?

>“/><br/>
串号:<input type=“text“ name=“ch“ value=“<?php echo $$v[’ch’]; ?>“/><br/>
内部名:<input type=“text“ name=“nn“ value=“<?php echo $$v[’nn’]; ?>“/><br/>
显示名:<input type=“text“ name=“xn“ value=“<?php echo $$v[’xn’]; ?>“/><br/>
作者:<input type=“text“ name=“zz“ value=“<?php echo $$v[’zz’]; ?>“/><br/>
介绍:<input type=“text“ name=“js“ value=“<?php echo $$v[’js’]; ?>“/><br/>
<input type=“submit“ name=“go“ value=“确定“/>
</form>
<?php }
else
{
include ’bmtxt.php’;
$$v=$$_POST;
if(putmrp($$f=“mrptmp/$$d.mrp“,$$v))
{
copy($$f,$$f.’.gz’);
echo ’修改成功<br/><a href=“mrptmp/’.$$d.’.mrp.gz?t=’.time().’“>下载</a><br/>’;
}
else
{echo “修改失败,文件过期或已损坏<br/>“;
unlink(“mrptmp/$$d.mrp“);}
echo ’<a href=“read.php?id=mrpgai&d=’.$$d.’“>返回修改</a>’;
}
}
else echo ’文件过期或已损坏,请<a href=“read.php?id=mrpup“>返回重传</a>’;
?>
</p><hr/><p><?php echo date(“m-d H:i“); ?><br/><a href=“read.php?id=mrpup“>返回上级

</a>-<a href=“index.php“>首页</a>
<a id=“bottom“ href=“#top“ accesskey=“3“></a></p>
</body>
</html>
------------------
bmmrp.php使用例程:mrppack.php
<?php
/********取得指定目录下指定类型的文件*******/
function dirgetlist($$dirname,$$bds=“.*“)
{
if($$handle=opendir($$dirname))
{
while(false!==($$file=readdir($$handle)))
{
if($$file!=“.“ && $$file!=“..“ && eregi($$bds,$$file))
{
$$list[]=$$dirname.’/’.$$file;
}}
closedir($$handle);
}
natcasesort($$list);
return $$list;
}
/***************/
function doonce($$f,$$t=5,$$e=’’)
{
$$ttl=file_get_contents($$f);
if(($$tt=($$tm=time())-$$ttl)<$$t)
{
echo str_replace($$t,$$t-$$tt,$$e);
return false;
}
file_put_contents($$f,$$tm);
return true;
}
function doonceend($$f)
{
return true;
}
/********这个是被包含在另一个文件中的部分用户界面*******/
$$d=floor($$_GET[’d’]);
$$go=$$_REQUEST[’go’];
include ’bmmrp.php’;
if($$go==’清空’)
{
$$lst=dirgetlist(“mrptmp/$$d“,’.*’);
foreach($$lst as $$a=>$$r)
unlink($$r);
unlink(“mrptmp/$$d“);
echo “文件已清空<br/>共删除“.($$a+1).“个文件<br/>“;
}
elseif($$go==’解包’ && doonce(’mrptmp/mrpunpack.php’,20,’解包过于频繁,请20秒后再试’))
{
$$lst=mrpunpack($$mrp,“mrptmp/$$d“);
echo “解包成功<br/>共解出“.count($$lst).“个文件<br/>“;
}
elseif($$go==’打包’ && doonce(’mrptmp/mrppack.php’,30,’打包过于频繁,请30秒后再试’))
{
$$list=dirgetlist(“mrptmp/$$d“,’.*\.txt$$’);
$$lst=mrppack(“mrptmp/$$d.mrp“,mrppacklist($$list,$$_POST[’gzip’]),$$mr_fn=“mrptmp/$$d.mrp“);
copy($$mr_fn,$$mr_fn.’.gz’);
echo “打包成功<br/>共打包“.count($$lst).“个文件(“.round(filesize(“mrptmp/

$$d.mrp“)/1024,2).“KB)<br/><a href=\“mrptmp/$$d.mrp.gz?t=“.time().“\“>下载</a>-<a

href=\“read.php?id=mrpgai&d=$$d\“>修改信息</a><br/>“;
$$mrppack=true;
下页    上页    全部    余下    
 

. 请牢记绝客网域名:jkniu.com jkmrp.com

发表回复

   


  通知楼主

4楼

老虎改吃草.01-14 15:04
看不懂

回复只看TA

地板

烟消^【云散】.12-13 19:45
√☆爱得过火★★

回复只看TA

椅子

★风流小猪★.12-12 20:49
顶老大

回复只看TA

沙发

『韩雅』 √☆爱得过火★★.12-12 13:11
:很好!(此回复虽有且仅有两个字,却深刻地表达了回复人的深深的祝福,可谓言简意赅,一字千金,字字扣人心弦,字字催人泪下,足可见回复人扎实的文字功底和信手拈来的写作技巧及惨绝人环的创新能力。实在佩服佩服!再加上以感叹号收尾,点睛之笔,妙笔生花,意境深远,照应前文,升华主题,把回复人的感情表达得淋漓尽致,给人无限感动和惆怅,有浑然天成之感,实乃回复中之极品,祝福中之绝笔

回复只看TA