2026年10月31日 · 今日 0 帖 · 会员 6.1万 · 主题 17.4万
登录 · 注册 · 游客,欢迎随便逛逛
返回版块
21296
Lv1韶华一笑间等级图标
帖子
1,026
回复
107
积分
864
注册
2011-03-19
[修改美化]

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

[复制链接]
查看 694 回复 4
楼主 发表于 | 只看该作者
13 人收藏

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),8));

$$id=pack(’H*’,binadd(dechex($$id),8));

$$bb=explode(’&’,$$v[’bb’]);

$$bb2=pack(’H*’,binadd(dechex($$bb),8));

$$bb=pack(’H*’,binadd(dechex($$bb),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.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).’.*[\\/](+\.)?(.[’.chr(94).’\\/]*)\.txt$$’,’\\2’,$$a);

#$$na=eregi_replace(’\(+\)$$’,’’,$$na);

$$n=strlen($$na)+1;

$$nn+=$$n;

$$lst[]=array($$na,$$a.’.gz’,$$al,$$n);

}

$$lstl=16*($$jc=count($$lst))+$$nn;

$$lst[]=$$lstl+248+$$lst;

for($$a=1;$$a<$$jc;$$a++)

$$lst[$$a][]=$$lst[$$a-1]+$$lst[$$a-1]+8+$$lst[$$a];

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),8)));

$$cd=strrev(pack(’H*’,binadd(dechex($$a),8)));

$$fl=pack(’H*’,binadd(dechex($$a),2));

#$$x=chr(0);

$$filelist.=$$fl.$$x.$$x.$$x.$$a.$$x.$$wz.$$cd.$$x.$$x.$$x.$$x;

$$dat.=$$fl.$$x.$$x.$$x.$$a.$$x.$$cd.file_get_contents($$a);

}

$$start=strrev(pack(’H*’,binadd(dechex($$lst-$$lst-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(“\(+\)$$“,$$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“&gt;

<html xmlns=“http://www.w3.org/1999/xhtml“&gt;

<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;

登录回复
5301
Lv10拔剑十里寒等级图标等级图标等级图标
勋章勋章勋章勋章勋章
帖子
23
回复
1,482
积分
704
注册
2011-01-01
1 楼

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

2715
Lv8能识八方语等级图标等级图标等级图标等级图标
勋章勋章勋章勋章勋章勋章
帖子
27
回复
4,574
积分
3.7万
注册
2010-12-02
2 楼

顶老大

66833
Lv6胸怀六国志等级图标等级图标
勋章勋章
帖子
0
回复
2,204
积分
45.5万
注册
2011-08-02
3 楼

√☆爱得过火★★

72816
Lv1韶华一笑间等级图标
帖子
1
回复
16
积分
0
注册
2011-09-11
4 楼

看不懂

登录后可以回复这个帖子。旧账号可使用原密码登录。

登录 注册新号
← 返回版块