Quartett!的二进制脚本分析 - 编程入门网
) {
100. builder.Append( c );
101. }
102.
103. return builder.ToString( );
104. }
105.
106. static readonly byte[ ] zeros
107. = new byte[ ] { 0, 0, 0 };
108. }
109.
110. struct Entry
111. {
112. public long position;
113. public string line;
114. public byte opcode;
115. public byte lastOpcode;
116.
117. public override string ToString( ) {
118. return string.Format( "0x{0:X} 0x{1:X} 0x{2:X} {3}",
119. this.position, this.lastOpcode, this.opcode, this.line );
120. }
121. }
122.}
Quartett!的二进制脚本分析(3)时间:2011-10-28 javaeye RednaxelaFX这段代码本身没什么稀奇,只有第57行到62行的内容有点诡异:居然把变量赋值给自己了? 不不,再怎么说我也不可能犯这种错误。这其实是C# 3.0里的一个有趣语法,initializer。可以通过 initializer,在使用new关键字构造新实例的时候指定其中一些字段的值;等号左边的是字段名,右边则 是字面量或者变量名(或者表达式)。编译器能够正确识别出看似是同名字的token之间的区别,因而能 够正确赋值。好吧我承认这不是好的编程习惯,大家看到了千万不要学,要引以为戒…… 另外,那个if里一大堆对currentByte的判断后来也重构到外面一个单独的MatchOpcode()方法里去了 。像上面这样写实在太恶心……也要引以为戒哦 虽然没什么稀奇,还是说下这个文件里的流程: 1、检查作为参数文件是否存在,并且是否后缀为tkn。检查不通过则退出程序。 2、获取一个Shift-JIS和一个UTF-16LE字符集的Encoding实例,并使用它们创建Shift-JIS的输入流和 UTF-16LE的输出流。 3、校验脚本文件的特征码(signature)。这里假设头12个字节都是特征码。 4、校验成功后,给输出流写出一个字节序标记(BOM,Byte Order Mark)。这本来应该不需要手工做 的,但我一直没弄清楚为什么我明明在创建utf16le时指定要BOM系统却不帮我自动做…… 5、创建一个队列来记录最近的三个字节。使用一个变量(lastOpcode)来记录最近的第四个字节。 6、扫描文件直到遇到文件结束。如果遇到了连续的3个00,则读入其后的一个字节,并判断是否在 [0x80, 0x88]的范围内;满足的话则读入一个C string并输出记录。 7、程序结束。 于是我得到了更新版的记录: (格式与前面相同) Java代码 0x15 0xC 0x85 # 0x1C 0xC 0x81 base_path 0x2B 0xC 0x83 ../ 0x34 0x16 0x85 # 0x3B 0x16 0x81 include 0x48 0x16 0x83 Script/BaseInstruction.txt 0x68 0x20 0x81 motion 0x74 0x20 0x81 Main Quartett!的二进制脚本分析(4)时间:2011-10-28 javaeye RednaxelaFX于是我恍然大悟:那“奇怪的数字”居然是脚本源文件行号!而被认为是操作码或者类型的那个字节 ,则用于指定后面字符串的类型:可以是符号、十进制数字、十六进制数字、标识符、字符串、符号等。 但位于脚本的0xC到0xF的那个数字(上图紫色部分)是什么意思还让我伤了下脑筋。观察了一下,发 现从0a69b4afebd6d64527a21e3f1aa993f9.tkn提取出来的“东西”一共有1237个,而那意义不明的数字是 0x876 = 2166,还差了不少。但总觉得它们应该有关系。突然想起我前面是用了个很糟糕的办法来提取记 录,有连续的3个00字节才满足条件。但假如行号超过了0xFF = 255行的话这个条件就不成立了。赶紧把 程序修改为第三版,按照新的理解去读入“行号”和“类型”两个数据,确认那个数字确实就是文件里总 的token数。 然后我才理解了signature里那TOKENSET的含义……这看似是二进制的脚本其实根本没有编译过的二进 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |