玩生化5时弹出0x01ac695f指令引用0x0000f319,内存不能为written。这怎么解决啊!?请高手们指导指导~谢谢
朋友,电脑出现:内存不能为written,原因总结起来,有以下方面,偶尔出现,点:取消,即可!
(答案原创,本答案原作者:力王历史)
1.电脑中了木马或者有病毒在干扰!
试试:杀毒软件,360安全卫士+360杀毒双引擎版,或者金山卫士+金山毒霸,
建议:修复“高危”和“重要”漏洞!使用“木马云查杀”和“360杀毒”,
“全盘扫描”和“自定义扫描”病毒和木马,删除后,重启电脑!
开机后,点开“隔离|恢复”,找到木马和病毒,彻底删除!
2.如果第1种方法不行,下载个“360系统急救箱”,或者“金山系统急救
箱”!
先点“开始急救”,查杀完毕,删除“可疑自启动项”和木马,再重启电脑!
然后点开“文件恢复”,找到“可疑自启动项”和木马,全选,再点“彻底删除文件”!
再点开“系统修复”,“全选”,再点“立即修复”!网络修复,开始修复,重启电脑!
3.用“360安全卫士”,“系统修复”,一键修复!再:“清理插件”,立即扫描,立即清理:恶评插件!
4.你下载的“播放器”,或“聊天软件”,或“IE浏览器”,或者“驱动”,或
“游戏”的程序不稳定,或者“版本太旧”!建议卸掉,下载新的,或将其升级
为“最新版本”!
5.软件冲突,你安装了两款或两款以上的同类软件(如:两款播放器,两款
qq,或多款浏览器,多款杀毒软件,多款网游等等)!它们在一起不“兼容”,
卸掉“多余”的那一款!
6.卸载方法:你在电脑左下角“开始”菜单里找到“强力卸载电脑上的软件”,找到多余的那款卸掉! 卸完了再“强力清扫”!
或者“360安全卫士”,“软件管家”,点开,第4项:“软件卸载”,点开,找
到“多余”和“类似”的软件卸载!如:“播放器”,点开,留下“暴风”,卸载“快播”!如:“下载”:点开,留下“迅雷”,卸载“快车”!(看准了再卸,别把有用的卸了)
7.再不行,重启电脑,开机后按“F8”,回车,回车,进到“安全模式”里,“高级启动选项”,找到:“最后一次正确配置”,按下去试试,看看效果如何!
8.再不行,开始菜单,运行 ,输入cmd, 回车,在命令提示符下输入(复制即可) :
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
粘贴,回车,直到屏幕滚动停止为止,重启电脑!
9.实在不行就“一键还原”系统或“重装系统”!
假如存档中粽子有4个,打开UE,16进制的物品编码是 69 0A 粽子
个数的计算就是:4+5=9,然后把10进制的9转化为16进制就是9
(注:计算器在开始-所有程序-附件-计算器,点查看,改成科学型)
所以搜索 69 0A 69 09 然后想改数字的就把09改了,一般都是改成99个,
那么99+5=104,转换成16进制就是68,粽子变成99个就是69 0A 69 68
如果想改变成其他物品,假如要改成BB,69 01 91 芙蓉仙子,那要在
69 0A 那插入一位(按ctrl+d),然后才能改成69 01 91。
注:物品和武器不能互相改,想要GM装备的,只要把自己身上的装备脱下来 ,按照物品代码改掉就好了。还有BB只能有一只,你改了99只也没用的。
物品代码在我的文章中都有!
2、人物等级及技能的修改
只要查找现有的经验,然后把它改成69 03 FF FF FF,就会是99级,搜索时会找到2个地址一样的,2个都要记得改,改完要保存!
第一个人物的经验是290251,大于122的数字不用+5,所以直接搜索290251的16进制数,看到了吗?我们写的时候要写成 03 CB 6D 04 ,03代表后面有3位
CB一位,6D一位,04一位。数字要倒过来写!现在开始查找!
看到了吗?一定要改2个地方的,别忘了!
3、点数修改
点数一定要在122点以上再查找,不然是很难找到的,你会找到很多相同的代码,不知道改哪个好,如果真的很想改,看一下我在论坛上发的关于小于122点的修改方法。
好了,看我做一下。相信经过上面2个教程,大家一定知道怎么找到并修改了吧!
看一下第二个人是307点,我们就搜索307的16进制数字是133,写成02 33 01
查找02 33 01,然后就改成你想要的点数就好了,我喜欢改成02 FF FF,看到了吧,已经很多点了。
回答者:categgs - 举人 四级 7-30 16:51
打开UE修改器,然后把代码输入进去,像包子是69 06,后面还要+个69 06,这里的06指得是1个,由于老关加了密,只能在06处+05,然后把69 06 69 06改成69 06 69 68,这个不用说了,就是99的16进制再+05,然后读存档,打开看看,是不是有99个包子了,要修改其他的物品,就把69 06 69 06 的第2个代码换了就可以了,如果要蚩尤蛋,就先拿1个蛋,输入69 XX 69 06 在UE中点右键选替换,或是上面一横中像ABC的图标,换成69 01 A6 69 01,再打开存档就有蚩尤蛋了
回答者:Cuo_Le - 举人 四级 7-30 17:02
我一直对梦幻群侠传里修改那些等级物品等修改感觉乏味,当看到敌人使用那些华丽而变态的法术时,不禁为自己垃圾的法术而感到十分惭愧,很想把法术也修改一下,但是总是找不到代码地址,在百度里根本找不到一个人发表技能修改的文章。自己心里觉得非常不爽,就试着利用UE在梦2里一个一个代码的试,皇天不负有心人,花了我整整二天二夜的时间终于找到了梦2(包括梦3)所有法术代码和修改,在无意中也找到了所有活物代码地址,现在在此发表,希望大家分享修改。
梦2所有活物代码:
6907水无痕
6909逍遥
690B云燕儿
690D上官锦纹
690F天麒
6910柳烟儿
6911水无痕(炎帝99级)
691A大海龟
691B巨蛙
691C海毛虫
691D大蝙蝠
691E野猪
691F泡泡
6920树怪
6921强盗
6922山贼
6923赌徒
6924羊头怪
6925狐狸精
6926蛤蟆精
6927骷髅怪
6928花妖
6929老虎
692A黑熊
692B狼
692C小龙女
692D虾兵
692E蟹将
692F牛妖
6930野鬼
6931僵尸
6932龟丞相
6933蜘蛛精
6934黑熊精
6935兔子怪
6936马面
6937牛头
6938白熊
6939古代瑞兽
693A蝴蝶仙子
693B黑山老妖
693C天兵
693D天将
693E风伯
693F地狱战神
6940雨师
6941蛟龙
6942凤凰
6943巡游天神
6944芙蓉仙子
6945如意仙子
6946星灵仙子
6947神兽熊猫
6948神兽金猴
6949神兽泡泡
694A神兽大象
694B吸血鬼
694C幽灵
694D律法女娲
694E灵符女娲
694F鬼将
6950净瓶女娲
6951修罗
6952灵鹤
6953雾中仙
6954炎魔
6955啸天虎
6956大力金刚
6957夜罗刹
6958小毛头
6959小丫头
695A蚩尤
695B熊猫武神
695C柳烟儿
695D神兽白泽
695E神兽灵鹿
695F火猴
6960猴仙人
69010B柳烟儿
69010C水无痕(炎帝)
所有法术修改代码:
6907防御 6908神佑复生
6909敏捷 690A魔法吸收
690B强力 690C连击
690D必杀 690E魔之心
690F魔法连击 6910高级再生
6911高级防御 6912高级神佑复生
6913高级敏捷 6914高级强力
6915高级魔法吸收 6916高级连击
6917高级必杀 6918高级魔之心
6919高级魔法连击 691A迟钝
691E无痕小 691F当头棒喝
6920包扎伤口 6928斩龙决
6929斩龙决 692A杀气决
692B无痕内 692C破血狂攻
692D战神念法 692E横扫千军
692F破釜沉舟 6930一鼓作气
6931破血狂攻 6935逍遥法
6936永生之泉 6937魔音不绝
6938三花聚顶 6939韦陀护法
693A唧唧歪歪3 693B达摩护法3
693C慈悲为怀 693D龙象磐若攻5
693E逍遥内 693F魔音不绝
6940推血过宫4 6941唧唧歪歪4
6942流云决3 6943天仙护体3
6944慈悲为怀 6945针炙
6946舍生取义 694B燕子法
694C五雷咒 694D迷魂
694E奔流激浪2 694F冰封符2
6950地烈火3 6951昏睡符3
6952日月无光4 6953疯魔符4
6954天降神雷 6955燕子封
6956五雷咒 6957奔流激浪2
6958日月无光3 6959地烈火3
695A疯魔符3 695B冰封符3
695C迷魂3 695D昏睡符3
6963上官物理 6964伤筋断骨
6965灭魂咒3 6966老化咒
6967幻影绝杀4 6968破法
6969渍血毒鞭 696A上官咒术
696B伤筋断骨 696C弱化咒
696D幻影绝杀3 696E破灵咒
696F老化咒 6970灭魂咒3
6971吸魂大法 697A柳烟儿
697B恩泽无边4 697C灰飞烟灭
6980水龙吟 6981断戈碎甲
6982善恶有报 6983亡灵之诅咒4
6984上古灵符 6985亡灵之佑3
6986泰山压顶3 6987地狱烈火3
6988断石碎金 6989虎啸震天
698A威吓之吼 698B河东狮吼
698C惊心一剑 698D炼狱恶灵5
698E水攻 698F落岩
6990烈火 6991雷击
6992水漫金山3 6993泰山压顶3
6994地狱烈火3 6995奔雷3
6996宠物法术 6997水攻
6999烈火 699B落岩
699E水漫金山 699F泰山压顶
690170凌天麒 690171乾坤斩4
690172夺命剑 6901A0连环击
6901A1蓄力(0) 6901A7横戈一击(0)
6901A8落岩(特殊) 6901AA奔雷3(特殊)
6901AB剧毒之蜇(0) 6901AD奔雷3(特殊)
6901AE夺魂计 6901AF龙象磐若攻2
6901B0伤筋断骨(0) 6901B1剧毒之牙(0)
6901B2破甲术3 6901B8尸腐毒(0)
6901B9地裂火3 6901BA连环击(0)
6901BF玉石俱焚 6901C1魔光毒虫3
6901C2色狼的欲火 6901C7化魂咒3
6901C8赤血毒镖(0) 6901D3火烧燎原4
6901D4棘刺遍地(0) 6901D5天星殒落5
6901D6天罗地网3 6901D8阎罗令4
6901D9讥讽术 6901DA诅咒术
6901DE咒封术 6901DF气拔山河6
6901E2咒封术 6901E3狮子吼4
6901E4续命决3 6901E5亡命相膊(0)
6901F1玉石俱焚(0) 6901F2吸星大法6
6901F3见血封喉(0) 6901F7地狱火3
6901F8野兽力博 6901F9狮子吼2
6901FB毒牙 6901FD冰刃切
6901FE取义成仁(0) 69E0粉身碎骨
69E7桃李满天下 69E8上古魔符
69EA三味真火6 69EB震天灭地
69CF蚩尤之博 69CE力辟华山
69CC天劫 69C4善恶有报
69C3恶灵之血 69C5上古灵符
69BD陀螺4 69BC皇帝内经
69BB惊心一剑 69025201皇帝内经
大家修改法术需要注意的是:主角只能用自己本身的几个技能替代别的技能,也就是主角修改法术有限,而宠物不同,宠物可以无限修改敌人技能,一个宠物想修改几个法术就能修改几个法术,相关的修改我就不想说了,自己擦索。
回答者:亜久津ぞ仁 - 千总 四级 8-1 10:30
你用游戏里的数据换成16位制的搜索,就能找到和你要盖的对应的
回答者:hjsy175 - 试用期 一级 8-1 20:47
骁龙695采用台积电6nm工艺制作,八核心CPU设计,具体由2个A78核心+6个A55小核心组成,其中A78核心频率2.2GHz,A55小核心频率1.8GHz,GPU是Adreno 619,支持5G功能。
麒麟710F采用12nm工艺制造,八核心CPU设计,具体由4个A73核心+4个A53小核心组成,其中A73核心频率2.2GHz,A53小核心频率1.7GHz,GPU采用Mali-G51 MP4,不支持5G功能。
CPU部分,骁龙695的A78架构在IPC性能上优势很明显,领先A73起码在120%以上,二者的大核CPU主频一样,根据IPC性能对比,骁龙695的单核性能是麒麟710F的2.2倍,多核性能领先40%也不会有什么问题。
在Geekbench 5测试中,骁龙695的单核成绩670分,多核成绩1886分,而麒麟710F的单核成绩328分,多核成绩1346分,可以看到骁龙695在GB5中,单核是对方的2倍,多核是对方的1.4倍,如此大的性能差距,用吊打来形容完全没有问题了。
至于GPU部分,参考安兔兔的成绩,麒麟710F的安兔兔得分也就是2W多,而骁龙695得分达到了9W多,领先对方几倍,吊打的更厉害了。
所以骁龙695和麒麟710F之间的区别不仅仅大,而且还很大,不客气的说麒麟710F的手机,放在现在就属于电子垃圾,根本就不会有多好的使用体验了,已经会出现卡顿的问题了,而骁龙695放在现在,日常使用还是很流畅的。
骁龙695的规格:
台积电6nm
Cpu:2*a78 2.2g 6*a55 1.8g
Gpu:adreno619(同750g,曼哈顿3.1 33帧)
X51基带台积电6nm
Cpu:2*a78 2.2g 6*a55 1.8g
Gpu:adreno619
总的来说,骁龙695就是骁龙750g的微略升级版,就是cpu挤了点牙膏,gpu都是750g一模一样的。其性能相当于天玑900,性能略低于麒麟820,相当于百分之60的骁龙865。不过695芯片阉割了视频硬件编解码能力,具体可以查芯片参数,最高才支持1080P。
至于麒麟710F,算是比较老的手机soc了,性能只相当于骁龙660,因此和骁龙695不可同日而语。
直接用鲁大师对比测试一下,看哪个性能更强。
很大啊,695是5G芯片啊,加工工艺和核心的架构都更先进。
感觉还是看看现在的机型来挑选,对于手机上所需要的软件可以通过360手机助手来搜索查找所需要的来安装使用。
用鲁大师对比测试,再根据需要选择性价比高的。
led him back to the family playing
1.硬件问题
一般来说,电脑硬件是很不容易坏的。内存出现问题的可能性并不大(除非你的内存真的是杂牌的一塌徒地),主要方面是:1。内存条坏了(二手内存情况居多)、2。使用了有质量问题的内存,3。内存插在主板上的金手指部分灰尘太多。4。使用不同品牌不同容量的内存,从而出现不兼容的情况。5。超频带来的散热问题。你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。
2.软件问题
先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“光标”。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的光标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用光标,继续在之后的执行中使用这块内存。真正的0地址内存区储存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的内存不能为“read”错误,并指出被引用的内存地址为“0x00000000“。内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中“安装”的病毒程序),更改了大量的系统参数和系统档案之后。 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,但不知为什么,这个预料中可用的光标已经失效了。有可能是“忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图“违法”的程序唯一的下场就是被操作终止执行,回收全部资源。计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。无效光标不一定总是0,因此错误提示中的内存地址也不一定为“0x00000000”,而是其它随机数字。
解决办法:
1. 检查系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。
2. 更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统档案、修正系统参数。有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序。
3.尽量使用最新正式版本的应用程序、Beta版、试用版都会有BUG。
4.删除然后重新创C:\WINDOWS\system32\wbem\Repository文件夹中的文件:在桌面上右击我的电脑,然后单击管理。 在"服务和应用程序"下,单击服务,然后关闭并停止 Windows Management Instrumentation 服务。 删除 C:\WINDOWS\system32\wbem\Repository 文件夹中的所有文件。(在删除前请创建这些文件的备份副本。) 打开"服务和应用程序",单击服务,然后打开并启动 Windows Management Instrumentation 服务。当服务重新启动时,将基于以下注册表项中所提供的信息重新创建这些文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs
软件例子:
下面搜集几个例子给大家分析: 例一:IE浏览器出现“0x0a8ba9ef”指令引用的“0x03713644” 内存,或者“0x70dcf39f”指令引用的“0x00000000”内存。该内存不能为“read”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。解决方法: 1、 开始-运行窗口,输入“regsvr32 actxprxy.dll”回车,接着会出现一个信息对话 框“DllRegisterServer in actxprxy.dll succeeded”,确定。再依次运行以下命令。(这个方法有人说没必要,但重新注册一下那些.dll对系统也没有坏处,反正多方下手,能解决问题就行。) regsvr32 shdocvw.dll regsvr32 oleaut32.dll regsvr32 actxprxy.dll regsvr32 mshtml.dll regsvr32 msjava.dll regsvr32 browseui.dll regsvr32 urlmon.dll 2、 修复或升级IE浏览器,同时打上系统补丁。看过其中一个修复方法是,把系统还原到系统初始的状态下。建议将IE升级到了6.0。 例二:有些应用程序错误: “0x7cd64998” 指令参考的 “0x14c96730” 内存。该内存不能为 “read”。解决方法:Win XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每一个应用程序的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟“内存映像”,并把这些信息储存到Windows\Prefetch文件夹。一旦建立了映像,应用软件的装入速度大大提高。XP的预读取数据储存了最近8次系统启动或应用软件启动的信息。建议将虚拟内存撤换,删除Windows\Prefetch目录下所有*.PF文件,让windows重新收集程序的物理地址。 例三:在XP下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内存。该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项。 例四:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的“0xffffffff”内存。该内存不能为“read” 的提示。 解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。 例五:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“0x060692f6”(每次变化)指令引用的“0xff000011”内存不能为“read”,终止程序请按确定。 解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。 例六:双击一个游戏的快捷方式,“0x77f5cd0”指令引用“0xffffffff”内 存,该内存不能为“read” ,并且提示Client.dat程序错误。解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。 例七:一个朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”指令引用的“0x00303033”内存,该内存不能为“written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。 解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。 该内存不能为read或written的解决方案关键词: 该内存不能为"read" 该内存不能为"written"
系统问题:
出现这种情况也有可能是系统问题,解决办法如下:
1.下载360安全卫士和360系统急救箱
2.重启电脑,按F8,切换到安全模式。打开360安全卫士,点击扫描插件,再全盘查杀病毒。删除病毒,无法删除的就隔离。接着切换到历史痕迹清理和垃圾文件扫描。
3.用系统自带的工具优化(以绝大多数人的系统装在C盘为例)。
①右击C盘--属性--进行磁盘清理--确定--是。
②右击C盘--属性--工具--开始整理--整理碎片,时间比较长,请耐心等候,这步很重要。完毕后,重启电脑
4.如果以上方法都失败了,重装系统吧。
供参考,祝你好运!
先彻底杀一次毒,看是不是病毒进程在使用文件,如果还是删不掉的话,有可能是权限设置的问题,在F盘的安全选项里面,把“everyone”的权限改成完全控制,应该就可以删除了。如果还是不能解决问题的话,建议把F盘的文件完全复制出来,再把磁盘格式化。
1、该品种株型紧凑,株高277厘米,穗位110厘米,全株叶片数21片,生育期为109天左右。雄穗分枝为8-12个,幼苗叶鞘为紫色,花药为绿色,花丝先青后紫。果穗呈筒型,穗轴是粉红色,穗长18.5厘米,穗行数14行左右,秃尖0.9厘米。
2、该品种的籽粒是黄色,马齿型,千粒重370.1克,出籽率85.0%。在2016年河北省农作物品种品质检测中心测定,蛋白质9.15%,脂肪3.74%,淀粉72.98%,赖氨酸0.23%。
3、该品种在2014年由河北省农林科学院植物保护研究所鉴定,中抗大斑病、茎腐病,抗小斑病,感矮花叶病;2015年经鉴定,高抗粗缩病,中抗弯孢叶斑病、茎腐病,抗小斑病、穗腐病。
二、明天695品种简介
1、品种介绍
(1)审定编号:明天695。
(2)申请者:江苏明天种业科技股份有限公司。
(3)育种者:江苏明天种业科技股份有限公司。
(4)品种来源:11F34×DZ72。
2、产量表现
明天695在2014年河北省夏播超密组区域试验中,平均亩产量为771kg。
3、种植要点
种植玉米时,为了让植株根系能够更好的扎根于泥土里面,一定要翻耕种植土壤,这样能够让玉米幼苗更快适应新环境,而且必须在适宜的天气中翻耕。
4、种植密度
玉米种植密度也会影响到产量,一亩地大概种植5000株左右即可。在这个密度之间,植株可以进行良好的采光,呼吸也会比较自然。对比其它的种植密度,一亩5000株的密度是产量最高的。
梦2所有活物代码:
6907水无痕
6909逍遥
690B云燕儿
690D上官锦纹
690F天麒
6910柳烟儿
6911水无痕(炎帝99级)
691A大海龟
691B巨蛙
691C海毛虫
691D大蝙蝠
691E野猪
691F泡泡
6920树怪
6921强盗
6922山贼
6923赌徒
6924羊头怪
6925狐狸精
6926蛤蟆精
6927骷髅怪
6928花妖
6929老虎
692A黑熊
692B狼
692C小龙女
692D虾兵
692E蟹将
692F牛妖
6930野鬼
6931僵尸
6932龟丞相
6933蜘蛛精
6934黑熊精
6935兔子怪
6936马面
6937牛头
6938白熊
6939古代瑞兽
693A蝴蝶仙子
693B黑山老妖
693C天兵
693D天将
693E风伯
693F地狱战神
6940雨师
6941蛟龙
6942凤凰
6943巡游天神
6944芙蓉仙子
6945如意仙子
6946星灵仙子
6947神兽熊猫
6948神兽金猴
6949神兽泡泡
694A神兽大象
694B吸血鬼
694C幽灵
694D律法女娲
694E灵符女娲
694F鬼将
6950净瓶女娲
6951修罗
6952灵鹤
6953雾中仙
6954炎魔
6955啸天虎
6956大力金刚
6957夜罗刹
6958小毛头
6959小丫头
695A蚩尤
695B熊猫武神
695C柳烟儿
695D神兽白泽
695E神兽灵鹿
695F火猴
6960猴仙人
69010B柳烟儿
69010C水无痕(炎帝)
所有法术修改代码:
6907防御 6908神佑复生
6909敏捷 690A魔法吸收
690B强力 690C连击
690D必杀 690E魔之心
690F魔法连击 6910高级再生
6911高级防御 6912高级神佑复生
6913高级敏捷 6914高级强力
6915高级魔法吸收 6916高级连击
6917高级必杀 6918高级魔之心
6919高级魔法连击 691A迟钝
691E无痕小 691F当头棒喝
6920包扎伤口 6928斩龙决
6929斩龙决 692A杀气决
692B无痕内 692C破血狂攻
692D战神念法 692E横扫千军
692F破釜沉舟 6930一鼓作气
6931破血狂攻 6935逍遥法
6936永生之泉 6937魔音不绝
6938三花聚顶 6939韦陀护法
693A唧唧歪歪3 693B达摩护法3
693C慈悲为怀 693D龙象磐若攻5
693E逍遥内 693F魔音不绝
6940推血过宫4 6941唧唧歪歪4
6942流云决3 6943天仙护体3
6944慈悲为怀 6945针炙
6946舍生取义 694B燕子法
694C五雷咒 694D迷魂
694E奔流激浪2 694F冰封符2
6950地烈火3 6951昏睡符3
6952日月无光4 6953疯魔符4
6954天降神雷 6955燕子封
6956五雷咒 6957奔流激浪2
6958日月无光3 6959地烈火3
695A疯魔符3 695B冰封符3
695C迷魂3 695D昏睡符3
6963上官物理 6964伤筋断骨
6965灭魂咒3 6966老化咒
6967幻影绝杀4 6968破法
6969渍血毒鞭 696A上官咒术
696B伤筋断骨 696C弱化咒
696D幻影绝杀3 696E破灵咒
696F老化咒 6970灭魂咒3
6971吸魂大法 697A柳烟儿
697B恩泽无边4 697C灰飞烟灭
6980水龙吟 6981断戈碎甲
6982善恶有报 6983亡灵之诅咒4
6984上古灵符 6985亡灵之佑3
6986泰山压顶3 6987地狱烈火3
6988断石碎金 6989虎啸震天
698A威吓之吼 698B河东狮吼
698C惊心一剑 698D炼狱恶灵5
698E水攻 698F落岩
6990烈火 6991雷击
6992水漫金山3 6993泰山压顶3
6994地狱烈火3 6995奔雷3
6996宠物法术 6997水攻
6999烈火 699B落岩
699E水漫金山 699F泰山压顶
690170凌天麒 690171乾坤斩4
690172夺命剑 6901A0连环击
6901A1蓄力(0) 6901A7横戈一击(0)
6901A8落岩(特殊) 6901AA奔雷3(特殊)
6901AB剧毒之蜇(0) 6901AD奔雷3(特殊)
6901AE夺魂计 6901AF龙象磐若攻2
6901B0伤筋断骨(0) 6901B1剧毒之牙(0)
6901B2破甲术3 6901B8尸腐毒(0)
6901B9地裂火3 6901BA连环击(0)
6901BF玉石俱焚 6901C1魔光毒虫3
6901C2色狼的欲火 6901C7化魂咒3
6901C8赤血毒镖(0) 6901D3火烧燎原4
6901D4棘刺遍地(0) 6901D5天星殒落5
6901D6天罗地网3 6901D8阎罗令4
6901D9讥讽术 6901DA诅咒术
6901DE咒封术 6901DF气拔山河6
6901E2咒封术 6901E3狮子吼4
6901E4续命决3 6901E5亡命相膊(0)
6901F1玉石俱焚(0) 6901F2吸星大法6
6901F3见血封喉(0) 6901F7地狱火3
6901F8野兽力博 6901F9狮子吼2
6901FB毒牙 6901FD冰刃切
6901FE取义成仁(0) 69E0粉身碎骨
69E7桃李满天下 69E8上古魔符
69EA三味真火6 69EB震天灭地
69CF蚩尤之博 69CE力辟华山
69CC天劫 69C4善恶有报
69C3恶灵之血 69C5上古灵符
69BD陀螺4 69BC皇帝内经
69BB惊心一剑 69025201皇帝内经
工具:SoftICE、金山游侠2002、VC++7.0、PE查看器、SPY++
测试平台:Window2000 Professional SP2
首先我介绍一下将会用到的工具:
1、 SoftICE(不用多说了吧,我想你应该会用)
2、 金山游侠2002(这个你也应该会用)
3、 VC++7.0(不要求你一定会用,但至少应该会一种编程工具)
4、 PE查看器(你可以随意找一个,没有也没关系,我会教你用SoftICE查看)
5、 SPY++(VC里的一个查看程序信息的工具,你可以和别的,比如Delphi和C++Builder的WinSight32)
然后就是你应该会的知识:
1、 汇编基础
2、 一些编程基础,至少应该看懂我介绍的几个API函数
3、 PE文件结构的基础,不会也没关系,我会解释给你
以上几点你都具备了的话我们就可以开始了。
我来介绍一下我要教给你的东西。想必大家都玩过PC游吧,那么也一定用过一些专用的游戏修改器吧,比如暗黑,红警,大富翁这些经典的游戏都有它们专用的修改器,注意,我说的不是FPE之类的通用修改工具。
你试没试过用金山游侠修改红警二的金钱?如果有的话你应该知道每玩一次就要改一次,因为这个游戏是动态分配内存的,每次重新开始都会改变。所以你会选择到网上去下载一个专用的修改器,那么你有没有想过自己做一上呢?想过?那你为什么不做?什么不会?那就好办了,看了这篇教程你就会了:D费话少说,我来讲一下原理。
有一些经常修改游的朋友一定会知道,不论游戏中“物品”的内存地址是否是动态的,物品与物品之间相隔的距离都是不变的,我拿“楚留香新传”为例,我先用金山游侠查找内力值的内存地址,找到的结果是:79F695C,再查找物品“金创药”的地址是:328D1DC,现在我用79F695C减去328D1DC,得到:4769780,这个数就是内力值与金创药的偏移值,没看懂?接着看呀,我还没说完呢,现在重新再运行游戏,查找内力值的地址,得到:798695C再查找金创药得到的地址是:321D1DC,两个值的内存地址都改变了,但是用你内力值的地址减去金创药的地址得到的结果是什么?没错,还是4769780,也就是说,无论这两个值的内存地址变成多少,它们之间的距离是永远不变的,不光是这个游戏,一般的游戏都是,至少我没见过不是的:D
上面讲的东西总结出一个结论,那就是我们只要得到这两个地址中的任何一个,就可以得到另外一个,只要你知道它们之间的偏移量是多少。
我们第一步要做的就是得到这个地址,但是内存中的地址是动态改变的,得到也没有用,这里我就教你把它变成静态的,叫它永远都不变!我继续拿“楚留香新传”为例,如果你有这个游的话就跟我一起做,没有的也没关系,只要看懂这几个步骤就行了。开工!
首先进入游戏,查找内值的地址,得到的是:798695C(不知道为什么这上游并不是每次重起都改变内存地址),按Ctrl+D打开SoftICE,下命令:BPM 798695C W(写这个地址时则中断),回到游戏中,打开人物属性面板,游戏中断了,在SofitICE中你会看到这条指令:
0047EB17 MOV EAX [EDX+000003F4] 下命令:D EDX+3F4将看到内力值
0047EB1D PUSH EAX
………………………………
………………………………
从上面可看出0047EB17处的指令是将内力值的指针送到EAX寄存器中,这是一个典型的寻址方式,设想一下,我们是到了EDX中的基址,那么无论什么时候只要用EDX+3F4就可以轻松的得到内力值的地址,因为000003F4是一个常量,它是不会改变的,改变的只是EDX中的地址,所以只要有办法得到EDX中的值就什么都好办了,你明白了没有?如果还是不懂,那么请再看一遍。现在要做的就是如何得到这个值,下面我教给你如何做:
我的办法就是设计一段代码,把EDX中的值存放到一个地址中,然后运行这段代码,再返回游戏的原有指令继续执行,什么?补丁技术?SMC?随你怎么说啦,只要运行正常就一切OK啦:D
实际操作:
首先在程序中找一段空白处来存放我们设计的代码,很简单,只要懂得一些PE文件结构的朋友都会知道,一般在EXE文件的数据段(.data段)的结尾都会有一段缓冲区,我们可以在这段区域中写任何东西,当然你也可以用“90大法”找一段空白区,但我还是推荐你用我教给你的方法。上同我提到,如果你没有PE文件查看工具我可以教你用SoftICE查看,而且很简单,只要一个命令:MAP32 “模块名”,看一下我是怎么做的你就知道了。
Ctrl+D呼收出SoftICE,然后下命令:MAP32 CrhChs,这时你应该看到EXE各个段的信息,我们要注意的只是.data段,既然要找的是数据段的结尾,那么我们就从下一个段开始向上找,如下:
.data 004FB000
.rsrc 00507000
.data的下一个段是.rsrc段,它是从00507000开始的,也就是说以00507000为基础向上一个字节就是数据段的结尾,我所择从00506950处开始写代码,说了这么半天那么我们的代码到底是什么样子呢?修改后的指令又是什么样的呢?别急,请看下面:
修改0047EB17后代码:
0047EB17 JMP 00506950 //跳到我们的代码中去执行
0047EB1C NOP //由于这条指令原来的长度是6字节,而修改后的长度是5个字节,所以用一个空指令补上
0047EB1D PUSH EAX
//我们的代码:
00506950 MOV DWORD PTR EAX,[EDX+00003F4] //恢复我们破坏的指令
00506956 MOV DWORD PTR [00506961],EDX //把EDX保存以00506961中去
0050695C JMP 0047EB1D //返回原来的指令去执行
把上面的代码用SoftICE的A命令写入,OK!
现在我们试一下运行的效果,你现在用金山游侠搜索一下内力址的地址,什么又变了?那就地啦,它要是不变我们还用费这么大劲儿吗?记下这个地址返回到游戏中去,Ctrl+D呼出SoftICE,下命令 D *[00506961]+000003F4,在数据窗口看到什么了?呵呵,没错,看到了你刚才记住的那个地址,里面的数值正是内力的值,试着改一下,回到游戏中,呵呵,内力值变了吧:D
讲到这里,我们的工作已经完成了%90,但别高兴的太早,后面的%10要远比前的%90花的时间长,因为我们要用编程实现这一切,因为你不能每次都像刚才那样做一次吧!
现在我来说一下编程的步骤:
首先用FindWindow函数得到窗口句柄,然后用GetWindowThreadID函数从窗口句柄得到这个进程的ID,接着用OpenProcess得到进程的读写权限,最后用WriteProcessMemory和ReadProcessMemory读写内存,然后。。。。呵呵,你的修改器就做成啦:D
下面是我抄写以前写的修改器源程序片断,第一部分是动态写入刚才的代码,第二部分是读取并修改内力值,由于我没有时间整理和测试,所以不能保证没有错误,如果大家发现有遗漏的话,可以在QQ上给我留言或写信给我,代码如下:
有几点请大家注意:
1、 写机器码时要一个字节一个字节的写
2、 注意要先写入自己的代码,然后再修改游中的指令(下面的代码没有这样做,因为不影响,但是你应该注意这个问题)
#define MY_CODE5 0x00
#define MY_CODE6 0x90
//00506950
#define MY2_CODE1 0x8B
#define MY2_CODE2 0x82 //这部分是要写入的机器码的常量定义
#define MY2_CODE3 0xF4
#define MY2_CODE4 0x03
#define MY2_CODE5 0x00
#define MY2_CODE6 0x00
#define MY3_CODE1 0x89
#define MY3_CODE2 0x15
#define MY3_CODE3 0x61
#define MY3_CODE4 0x69
#define MY3_CODE5 0x50
#define MY3_CODE6 0x00
#define MY4_CODE1 0xE9
#define MY4_CODE2 0xBC
#define MY4_CODE3 0x81
#define MY4_CODE4 0xF7
#define MY4_CODE5 0xFF
//-----------------------------------------------------------------------------//
DWORD A1 =MY_CODE1
DWORD A2 =MY_CODE2
DWORD A3 =MY_CODE3
DWORD A4 =MY_CODE4
DWORD A5 =MY_CODE5
DWORD A6 =MY_CODE6
DWORD B1 =MY2_CODE1
DWORD B2 =MY2_CODE2
DWORD B3 =MY2_CODE3//这部分是变量的定义
DWORD B4 =MY2_CODE4
DWORD B5 =MY2_CODE5
DWORD B6 =MY2_CODE6
DWORD C1 =MY3_CODE1
DWORD C2 =MY3_CODE2
DWORD C3 =MY3_CODE3
DWORD C4 =MY3_CODE4
DWORD C5 =MY3_CODE5
DWORD C6 =MY3_CODE6
DWORD D1 =MY4_CODE1
DWORD D2 =MY4_CODE2
DWORD D3 =MY4_CODE3
DWORD D4 =MY4_CODE4
DWORD D5 =MY4_CODE5
//--------------------------------------------------------------------------//
HWND hWnd =::FindWindow("CRHClass",NULL)//得到窗口句柄
if(hWnd ==FALSE)
MessageBox("游戏没有运行!")
else
{
GetWindowThreadProcessId(hWnd,&hProcId)// 从窗口句柄得到进程ID
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,hProcId)//打开进程并得到读与权限
if(nOK ==NULL)
MessageBox("打开进程时出错")
else
{
//0047EB17
WriteProcessMemory(nOK,(LPVOID)0x0047EB17,&A1,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0047EB18,&A2,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0047EB19,&A3,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0047EB1A,&A4,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0047EB1B,&A5,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0047EB1C,&A6,1,NULL)
//00506950
WriteProcessMemory(nOK,(LPVOID)0x00506950,&B1,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506951,&B2,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506952,&B3,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506953,&B4,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506954,&B5,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506955,&B6,1,NULL)
//第二句
WriteProcessMemory(nOK,(LPVOID)0x00506956,&C1,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506957,&C2,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506958,&C3,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506959,&C4,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0050695A,&C5,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0050695B,&C6,1,NULL)
//最后一句
WriteProcessMemory(nOK,(LPVOID)0x0050695C,&D1,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0050695D,&D2,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0050695E,&D3,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x0050695F,&D4,1,NULL)
WriteProcessMemory(nOK,(LPVOID)0x00506960,&D5,1,NULL)
CloseHandle(nOK)//关闭进程句柄
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//读取并修改内力值
DWORD hProcId
HWND hWnd =::FindWindow("CRHClass",NULL)
if(hWnd ==FALSE)
MessageBox("No")
else
{
GetWindowThreadProcessId(hWnd,&hProcId)
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,hProcId)
if(nOK ==NULL)
MessageBox("ProcNo!")
else
{
DWORD buf1
DWORD write
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x00506961,(LPVOID)&buf1,4,NULL)//读取我们保存EDX中的基础
if(OK ==TRUE)
{
write =buf1+0x000003F4//得到内力值的地址
DWORD Writeed =0x00//要修改的数值
BOOL B =WriteProcessMemory(nOK,(LPVOID)write,&Writeed,1,NULL)
if(B==FALSE)
MessageBox("WriteNo")
}
}
CloseHandle(nOK)
}
啊,写的我手都麻啦,今天就到这里了,才疏学浅难免会有遗漏,请大家指教,如果我不会或不喜欢用VC的话,你可以在QQ上与我交流,我可以教你如何用Delphi、C++Builder、Win32Asm或VC实同上面的功能。
(如转载本篇文章请不要改动内容及作者!)
作者:CrackYY
Email:CoolYY@msn.com
OICQ:20651482
2001年,从云风那儿得知了IDA这种好东东,看到他在解恺撒的游戏资源,觉得好玩,也开始自己解一些东东,当时一口气解了一些游戏的资源,当然,都不是很复杂的,主要是台湾和日本的
后来在主页上放过一段时间,记得感兴趣的朋友还挺多的,一直没时间说,现在大概聊一下做法吧:)
工具当然是IDA+SoftIce,要自己写解压程序的话,还要有习惯的编辑器,我当然是用VC
其实,资源破解,并不是很复杂,方法大致有3种
1,硬性破解
通过观察目标文件和反汇编代码,分析出资源压缩或者加密的格式,写程序读取改文件,并转换成一种自己可以识别的格式就OK了
这是自己动手解资源时最容易想到的做法
具体来说,也就是通过一些特定函数,譬如 fopen、createFile这样的文件相关函数,确定游戏的解资源函数,然后就拼命的分析汇编代码就OK了
我前期大部分资源都是这样破解的,最好先用UEDIT分析一下实际的文件,有些格式太简单了,通过文件大小,用看的就可以了
这种方法,我解过的最复杂的就是神奇传说系列,当时就感觉和GIF比较像,但又不太一样,因为对压缩算法没研究,所以就没深究了,不过后来从网上看到文章说,那是一个很通用的压缩算法,一些解压工具就可以可以解开的,◎#¥%……真是不爽(不过还好,我只花了几个小时就解开那个游戏而已
2,Dump
等图片载入后,直接从内存中导出
这种做法也很容易想到的,主要难点在于内存中资源的格式问题,可能对3D游戏来说,这种解法比较容易一些,毕竟纹理渲染这些,是显卡完成的,不是软件实现的
我了解到的有些人解魔兽的资源就是这样解开的,hook OpenGL的一些函数
我这样解过一些游戏的文本(汉化用的文字),赛车游戏的,为了获取所有游戏文本,特地将那款游戏通关的说
3,直接调用游戏的解码函数解码
和第2种做法类似,但是主动调用函数,基本上可以一次将所有资源全部解开,不需要游戏通关
当然,不是让你调用游戏的解包模块,毕竟很多游戏都不是dll形式的
只能侵入到游戏进程内部,找一个合适的时机(一般是载入其他文件的时候,中断跳转一下,先把我们的事做完),调用内部函数,解开所有的资源
我解过一款游戏就是用这种方法,说起来,那款游戏的资源压缩率和rar差不多
0. 需求文档
LZW压缩算法是一种新颖的压缩方法,由Lemple-Ziv-Welch 三人共同创造,用他们的名字命名。它采用了一种先进的串表压缩,将每个第一次出现的串放在一个串表中,用一个数字来表示串,压缩文件只存贮数字,则不存贮串,从而使文件的压缩效率得到较大的提高。奇妙的是,不管是在压缩还是在解压缩的过程中都能正确的建立这个串表,压缩或解压缩完成后,这个串表又被丢弃。
1. 基本原理
首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数字来表示,这个数字与此字符串在串表中的位置有关,并将这个数字存入压缩文件中,如果这个字符串再次出现时,即可用表示它的数字来代替,并将这个数字存入文件中。压缩完成后将串表丢弃。如"print" 字符串,如果在压缩时用266表示,只要再次出现,均用266表示,并将"print"字符串存入串表中,在解码时遇到数字266,即可从串表中查出266所代表的字符串"print",在解压缩时,串表可以根据压缩数据重新生成。
2. 实现方法
A. 初始化串表
在压缩信息时,首先要建立一个字符串表,用以记录每个第一次出现的字符串。一个字符串表最少由两个字符数组构成,一个称为当前数组,一个称为前缀数组,因为在文件中每个基本字符串的长度通常为2(但它表示的实际字符串长度可达几百甚至上千),一个基本字符串由当前字符和它前面的字符(也称前缀)构成。前缀数组中存入字符串中的首字符,当前数组存放字符串中的尾字符,其存入位置相同,因此只要确定一个下标,就可确定它所存贮的基本字符串,所以在数据压缩时,用下标代替基本字符串。一般串表大小为4096个字节(即2 的12次方),这意味着一个串表中最多能存贮4096个基本字符串,在初始化时根据文件中字符数目多少,将串表中起始位置的字节均赋以数字,通常当前数组中的内容为该元素的序号(即下标),如第一个元素为0,第二个元素为1,第15个元素为14 ,直到下标为字符数目加2的元素为止。如果字符数为256,则要初始化到第258个字节,该字节中的数值为257。其中数字256表示清除码,数字257 为文件结束码。后面的字节存放文件中每一个第一次出现的串。同样也要音乐会 前缀数组初始化,其中各元素的值为任意数,但一般均将其各位置1,即将开始位置的各元素初始化为0xFF,初始化的元素数目与当前数组相同,其后的元素则要存入每一个第一次出现的字符串了。如果加大串表的长度可进一步提高压缩效率,但会降低解码速度。
B. 压缩方法
了解压缩方法时,先要了解几个名词,一是字符流,二是代码流,三是当前码,四是当前前缀。字符流是源文件文件中未经压缩的文件数据;代码流是压缩后写入文件的压缩文件数据;当前码是从字符流中刚刚读入的字符;当前前缀是刚读入字符前面的字符。
文件在压缩时,不论文件字符位数是多少,均要将颜色值按字节的单位放入代码流中,每个字节均表示一种颜色。虽然在源文件文件中用一个字节表示16色、4色、2色时会出现4位或更多位的浪费(因为用一个字节中的4位就可以表示16色),但用LZW 压缩法时可回收字节中的空闲位。在压缩时,先从字符流中读取第一个字符作为当前前缀,再取第二个字符作为当前码,当前前缀与当前码构成第一个基本字符串(如当前前缀为A,当前码为B则此字符串即为AB),查串表,此时肯定不会找到同样字符串,则将此字符串写入串表,当前前缀写入前缀数组,当前码写入当前数组,并将当前前缀送入代码流,当前码放入当前前缀,接着读取下一个字符,该字符即为当前码了,此时又形成了一个新的基本字符串 (若当前码为C,则此基本字符串为BC),查串表,若有此串,则丢弃当前前缀中的值,用该串在串表中的位置代码(即下标)作为当前前缀,再读取下一个字符作为当前码,形成新的基本字符串,直到整个文件压缩完成。由此可看出,在压缩时,前缀数组中的值就是代码流中的字符,大于字符数目的代码肯定表示一个字符串,而小于或等于字符数目的代码即为字符本身。
C. 清除码
事实上压缩一个文件时,常常要对串表进行多次初始化,往往文件中出现的第一次出现的基本字符串个数会超过4096个,在压缩过程中只要字符串的长度超过了4096,就要将当前前缀和当前码输入代码流,并向代码流中加入一个清除码,初始化串表,继续按上述方法进行压缩。
D. 结束码
当所有压缩完成后,就向代码流中输出一个文件结束码,其值为字符数加1,在256色文件中,结束码为257。
E. 字节空间回收
在文件输出的代码流中的数据,除了以数据包的形式存放之外,所有的代码均按单位存贮,样就有效的节省了存贮空间。这如同4位彩色(16色)的文件,按字节存放时,只能利用其中的4位,另外的4位就浪费了,可按位存贮时,每个字节就可以存放两个颜色代码了。事实上在 文件中,使用了一种可变数的存贮方法,由压缩过程可看出,串表前缀数组中各元素的值颁是有规律的,以256色的文件中,第258-511元素中值的范围是0-510 ,正好可用9位的二进制数表示,第512-1023元素中值的范围是0-1022,正好可用10位的二进制数表示,第1024-2047 元素中值的范围是0-2046,正好用11位的二进制数表示,第2048-4095元素中值的范围是0-4094,正好用12位的二进制数表示。用可变位数存贮代码时,基础位数为文件字符位数加1,随着代码数的增加,位数也在加大,直到位数超过为12(此时字符串表中的字符串个数正好为2 的12次方,即4096个)。 其基本方法是:每向代码流加入一个字符,就要判别此字符所在串在串表中的位置(即下标)是否超过2的当前位数次方,一旦超过,位数加1。如在4位文件中,对于刚开始的代码按5位存贮,第一个字节的低5位放第一个代码,高三位为第二个代码的低3位,第二个字节的低2位放第二个代码的高两位,依次类推。对于8位(256色)的文件,其基础位数就为9,一个代码最小要放在两个字节。
F. 压缩范围
以下为文件编码实例,如果留心您会发现这是一种奇妙的编码方法,同时为什么在压缩完成后不再需要串表,而且还在解码时根据代码流信息能重新创建串表。
字 符 串: 1,2,1,1,1,1,2,3,4,1,2,3,4,5,9,…
当 前 码: 2,1,1,1,1,2,3,4,1,2,3,4,5,9,…
当前前缀: 1,2,1,1,260,1,258,3,4,1,258,262,4,5,…
当前数组: 2,1,1, 1, 3,4,1, 4,5,9,…
数组下标: 258,259,260,261,262,263,264,265,266,267,…
代 码 流: 1,2,1,260,258,3,4,262,4,5,…
3. 测试文档
说明:
当选择时请选择1-3的数据,如果选了其他的数据就出错了。
4. 使用文档
在进入程序后,通过选择是压缩、解压缩还是退出程序。
压缩文件:
1)提示:“Input file name?” 输入:D:\cc\test.txt
2)提示:“Compressed file name?” 输入:test.lzw
3)显示:“Compressing………” 及 “*”表示文件压缩的进度。
说明:如果输入的文件不存在,将会重复提示,直到输入正确文件位置和文件名。生成的test.lzw将会存放在程序所在的根目录下。
如:程序放在D:\cc\下,则生成文件也在D:\cc\.
解压缩:
1)提示:“Input file name?” 输入:test.lzw
2)提示:“Compressed file name?” 输入:test.txt
3)显示:“Expand………” 及 “*”表示文件解压缩的进度。
说明:如果输入的文件不存在,将会重复提示,直到输入正确文件位置和文件名。生成的test.lzw将会存放在程序所在的根目录下。
ANI(APPlicedon Startins Hour Glass)文件是 MS-Windows的动画光标文件,其文件扩展名为“.ani”。它一般由四部分构成:文字说明区、信息区、时间控制区和数据区,即 ACONLIST块。anih块、rate块和 LIST块。
以下就是作为例子的文件内容(数据E)及ANI文件标准结构图(图):
1. 从(0000-006D)是 Wnd0WS 95& NT ANI文件的文字说明区部分
如你想对你开发的ANI文件提供一点文字说明,并加入你的版权信息,且同时它们又要被ANI文件播放软件承认时,这是你唯一的选择。要是你觉得这样做很麻烦,或者没什么好写时,那你完全可以去掉本块中的全部内容,并将块的大小置为0。切记,“块识别码
‘ ACONLIST’”和标识“块的大小”这两部分,共计 12字节,绝对不能被更改、移动及删除,否则后果自负。
可能为了让文字说明信息系统化,在ACONLIST块内部包容了若干子块,本例中用到的两个分别是:INFOINAM块(提供本文件的解释说明)和IART块(用于插入版本信息)。说实在,诸位可以运用在 AVI文件中插入自定义块的方法,加入自己的自定义块,其结果只是ANI播放软件把它当作一个“JUNK”罢了。
0000-0003:多媒体文件识别码:RIFF
0004-0007;文件大小( 2052h字节)-8字节
0008- 000F: ACONLIST块识别码,它是文字说明区开始的标志
0010-0013:ACONLIST块的大小(5Ah字节)
0014-001B:INFOINAM块识别码,标志文件说明信息子块的开始
001C- 001F: INFOINAM块的大小( 20h字节)
0020-003F :文件说明信息子块的内容“Application startingHour Glass”
0040-0043:IART块识别码,标志版权说明信息于决的开始
0044-0047:IART块的大小(26h字节)
0048- 006D:版权说明信息于块的内容“Microsoft Corporation,Copyright 1995”
2.从(006E-0099)?