WINHEX高级专题第四讲
简单结构
通常在C系列(C++、C#,JA V A)语言中,符号占据了语法构成的绝大部分,比如“:”在面向对象编程中既有类之间的继承含义,又有三项表达式中的遴选含义。继承可以是从基类的继承,更可以是对接口的实现,对构造函数的调用,对switch标签的终结。分号表示语句的结束,花括号表示对执行程序的分块。圆括号包含参数列表,同时又起到强制转换、隔离代码元素、定义表达式求值顺序的更重要的作用。对上面的列举,我们可以总结为:程序是由符号的多重含义组织成的简单结构。
上面的话乍听起来很拗口、很抽象。没关系,程序就是对现实世界事务的抽象,是表达意愿的抽象,是计算机对人类思维进行探究的抽象。如果我们要学习编程,就必须适应这种抽象,必须养成一种以点代面的思维方式。有的朋友会说:“我们恰恰缺少的就是这种思维方式。”其实他们说的这句话本身就已经是对自己思维能力的抽象,“缺少”两个字着实是严重了。
我们不妨先看一段代码:
//声明一个在程序集中访问级别为公共的结构,结构名称为TESTWINHEXCODE public struct TESTWINHEXCODE
{
//为该结构声明一个公有的构造函数,该构造函数有两个形参,
//分别是类型为单精度浮点型的var1和var2
public TESTWINHEXCODE(float var1,float var2)
{
//构造中执行一个输出语句,输出的第2实参是一个表达式,
//结果为var1和var2的和。同时,在第1实参字符格式设置参数中,
//占位符为0号,同时设置输出显示精度为两位小数
Console.WriteLine("{0:F}",var1+var2);
}
}
/
/声明一个访问权限默为公共的类类型Program
class Program
{
//声明一个静态的,返回类型为无的应用程序入口执行函数Main,
//同时声明一个形参args,它需要从外部获取一个字符串数组。
static void Main(string[] args)
{
/*声明一个单精度浮点型数组,它有两个元素,
* 一个是2.0,一个是3.0,我么称之为硬编码。
* 为了使类型更为精确,我们对它们进行了强制转换
*/
float[] vals = {(float)2.0,(float)3.0 };
//声明一个结构TESTWINHEXCODE的变量ts,
//并t将一个TESTWINHEXCODE引用返回给ts,同时从外部执行构造
TESTWINHEXCODE ts = new TESTWINHEXCODE(vals[0],vals[1]); }
}
上面的代码中,我详细地给出了每一句的注释,这是一段非常简单的代码,程序的第一阶段声明了一个结构,并定义了构造。程序的第二阶段是执行部分,演示了标准实例化构造过程。程序的结果不用执行也能看出是5.00.
如果要用WINHEX脚本来实现,便困难得多,因为WINHEX脚本缺乏符号的多重含义。难道,WINHEX脚本已经不能算是严格意义上的程序了?
其实,WINHEX脚本与高级程序语言的区别还体现在WINHEX缺乏庞大的预定义系统。在一门语言的
设计初期,往往只存在少量的关键字和编译逻辑,后来,随着对语言功能要求的逐步提升,关键字经过复杂的二次组合,形成更为高级的、严密封装的上层结构,封装后的关键字在程序中一句顶替原先很多功能(执行了它封装的低级语句)。这种层次分明的封装,造就了高级程序语言的预定义系统,举几个简单的例子我们经常用到的int、float等简单类型,其实质是一个结构,
我们完全可以从它们身上到结构的所有功能和限制。我们用到的+-*/d等数学符号,背后都隐藏着一个执行函数,只是它们没有反应到台面上而已。C#和C++都支持强大的运算符重载,其实就是对原先执行函数的重定义。
WINHEX的预定义系统不可能跳出原先作者设计程序时定义的功能,但是我们可以用三种方法来努力打破这种限制:
1.利用嵌套脚本来完成。
2.利用WINHEXAPI函数来完成。
3.通过脚本调用其它语言程序来完成。
上面的程序,可以这样用脚本来实现:
脚本NUM8.1
脚本MUM8.2
assign love1 2
我们首先声明一个变量love1 给它赋值为2
SetVarSize love1 1
我们将变量love1的数据长度限制为1个字节
create "D:\1.txt" 1
我们创建一个文本文件,大小为1字节
Close
我们关闭该文件
create "D:\2.txt" 1
我们创建一个文本文件,大小为1字节
Close
我们关闭该文件
assign love2 3
我们声明一个变量love2,赋值为3
SetVarSize love2 1
我们将变量love2的数据长度限制为1个字节
open "D:\1.txt"
我们打开D:\1.txt
writeline输出数值变量write2 love1
我们写入love1,注意这里用的是“write2”,它可以保证光标位置不发生变化。open "D:\2.txt"
我们打开D:\1.txt
write2 love2
我们写入love2
…
………………….
ExecuteScript "E:\winhex\NUM8.2"
我们启动脚本E:\winhex\NUM8.2,注意要指定详细路径
Read love1 1
我们从当前位置读取一个字节数据到变量love1中
NextObj
转移到下一个工程
Read love2 1
我们从当前位置读取一个字节数据到变量love2中
assign love3 (love1+love2)
我们将表达式love1+love2装入变量love3
messagebox "love3"
显示love3中的数据
Create "D:\" 1000
创建一个大小为1000字节的文本
write love3
将LOVE3写入该文本
程序运行结果:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
上面这段脚本实现了程序的功能,但是还不值得庆贺,因为它仅仅是通过一个嵌套脚本来实现的。在这中间我们创建了许多用于缓冲数据的文本文件,注意,建立缓冲文本是WINHEX脚本的最绝妙的编程技巧之一。
该程序其实还可以这样实现:
create "D:\" 348
创建一个348字节的文本
assign love1 "assign love7 2 "
声明变量love1为语句“assign love7 2”
assign love2 "SetVarSize love7 1"
设定变量love2为"SetVarSize love7 1"
assign love3 "assign love8 3"
声明变量love3为语句“assign love7 2”
assign love4 "SetVarSize love8 1"
assign love5 "assign love9 (love7+love8)"
声明变量love5为语句“assign love9 (love7+love8)”
assign love6 "write love9"
write love1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论