⾃⼰制作winhex的模板
  winhex有很多的官⽅模板,可以在⽹上下载(后缀tpl)并放⾄它的安装⽬录,即可使⽤。不过要是⾃⼰能⾃⼰制作,这才好玩,不是么?!
  打开模板管理器,可以选中其中⼀个模板,下⾯有应⽤,有编辑,你点开编辑按钮,就可以看到对应的模板源码。⽽你点开那个新建按钮,就可以⾃⼰写模板了,最后保存到安装⽬录即可。提醒⼀点,我是在记事本下写好粘贴到新建后那个⾯板上的,因为我发现有好些符号它不⽀持,⽐如下划线、引号等,maybe是我⾃⼰没设置的原因,不过,这不是重点,略过。写好后,那个⾯板下有检查语法的按钮,通过它可判断你的代码是否语法正确。
  闲话不多说,下⾯,我来讲解下模板编程的语法:
  模板头的常⽤关键字:
  1.template:声明模板的名字  eg:template "模板1"
  2.description:描述参数,描述这个模板的⽤途。(保存好后,你可以在模板管理器⾥看到你⾃定义的模板的名字,描述等信息。)eg:description "这个模板是⽤来。。。"
  3.applies_to:参数可以是file/disk/RAM。指定该模板的适⽤对象时⽂件、磁盘还是内存。eg:applies_to disk
  4.fixed_start offset:模板的默认起始偏移量取决于光标停留的位置,⽽这个关键字是来指定偏移量起始位置。eg:fixed_start 0x040
  5.sector-aligned:作⽤是指定模板从当前扇区的偏移0位置运⾏。⽆参数。
  6.requires offset:匹配数据,若发现指定偏移量的位置的数据不匹配,就会报错。注意:这⾥的偏移量是相对于模板起始偏移量计算的。eg:requires 0x1fe "55aa"
  7.big-endian/little-endian:规定读取的字节顺序,也就是平⽇说的⼩端机、⼤端机的区别,内存的数据存储⽅向不⼀样。⽆参数。
  8.hexadecimal:使模板中读到的数据都以⼗六进制⽅式显⽰,octal为⼋进制,decimal为⼗进制。⽆参数。
  9.read-only/read-write:规定读取权限。⽆参数。
  10.multiple:作⽤是使模板上出现左右键来让你可以选择读取上⼀条或下⼀条记录,记录之间的跨度是该模板涉及的所有字节的长度。⽆参数。
  11.begin与end:之间的区域⽤于存放程序主⼲。
  这⾥作下模板头知识总结:⾸先,模板的命名需要关键字template加引号完成。description参数可以补充描述。applies_to(RAM、file、disk)后⾯可以⽤于指定访问对象的类型,使模板适应当前⼯程的根本环境。fixed_start可以为模板指定起始偏移量。requires则制定更严格的模板运⾏条件,要求模板作⽤范围内指定位置必须匹配指定数据。big-endian、hexadecimal、read-only等都是作⽤于显⽰输出的可选参数。头部关键字没有强制规定“出场顺序”,对引号的要求也不严格。此外,模板可以⽤双斜杠添加注释,这是⼀个很好的编程习惯。
  注意:数制属性关键字(hexadecimal等)、显⽰⽅向属性关键字(big-endian等)、读写属性关键字(read-only等)都可以插⼊begin与end之间,⽤于临时改变数据的属性,注意这种改变仅仅作⽤于紧随它们的数据类型声明语句,⽽并⾮全局。
  下⾯说下程序主⼲⾥的常⽤关键字:
  1.int8:带符号的8位整型,占⽤⼀字节,范围-128~127。eg:int8 "⾝⾼"
  2.uint8:⽆符号的8为整型,占⽤⼀字节,范围0~255。同byte类型。
  3.int16:带符号的16位整型,占⽤2字节。
  不赘述了,与前⾯这些类似的还有:uint16, int32, uint32, int64, int24, uint24。
  4.unit_flex:类似于c语⾔⾥位域的概念。其语法是:unit_flex "要解释的位" "title"
  例如:unit_flex "8,7,6,5,4,3,2,1,0" "permissions",表⽰读取⼀个32位⽆符号整数并解释其低9位。
  注意,尽管unit_flex所表⽰的数据长度可能⼩于4个字节,但每次读取仍然按照4个字节来计算,故⽽要特别注意位域的实际长度。⽐如,我们要解释⼀个16位整型数值的前4位和后12位,应当⾸先解释前4位,这时光标移动4字节。unit_flex "3,2,1,0" "flexlow" 因为还有数据要从该16位整型数值中提取,故回退4个字节。move -4 。解释后12位。unit_flex "15,14,13,12,11,10,9,8,7,6,5,4" "flexhigh"  由于16位整型数值只占⽤两个字节,⽽实际光标移动4字节,故需要回退2字节:move -2,  否则会占⽤下⼀个数据的空间。
  5.binary:每次读取⼀个字节,并解释为⼆进制样式。
  6.char:读取⼀个字节,ascii码显⽰。也可以⽤char[len]读取字符数组(字符串),len表⽰长度。
  7.char16:读取两个字节,Unicode字符显⽰。
  8.string:ascii字符串。语法为string len "title"
  9.string16:unicode字符串。
  10.zstring:表⽰不管长度读取⼀个ascii字符串,遇到"NULL"时结束。zstring16为其Unicode版本。
  11.hex:表⽰直接读取字节⽽且并不将其解释为任何数据类型,直接显⽰。
  12.float:占⽤4字节,浮点数,同c语⾔。
  13.real:占⽤6字节,浮点数。
  14.double:占⽤8字节,浮点数。
  15.longdouble:占⽤10字节,浮点数。
  16.Loop:实现简单的循环。中括号中可以存放常量表⽰循环次数,也可以直接引⽤前⾯数据类型的title。
  17.IfEqual:简单的if语句,判断是否相等。⽐较的对象可以是常量,也可以是前⾯数据类型的title。
  eg:
byte"学号"
IfEqual  "学号"09
uint"成绩"
Else
uint"绩点”
EndIf
  18.~:占位符。⼀般⽤于循环内部数据类型的标题中,以形成数字递增的效果。常常与numbering配合使⽤。numbering可以⽤来指定占位符的初始值。
  eg:
uint32  "⽂件数⽬"
numbering 1
{
string16  255"~号⽂件"
}["⽂件数⽬"]
//占位符从1开始,循环代⼊string16 255 "~号⽂件"中。
  下⾯是随⼿写的⼀个例⼦,很凑合的说~
  源码:
免费模板制作下载template "the dbr of ntfs of jiu"
description "......"
applies_to disk
sector-aligned
requires 0x03"4e54465320"
requires 0x1f0"55aa"
little-endian
read-write
multiple
begin
hex 3"jmp"
char[8]      "OEM"
uint16      "bytes per sector"
uint8        "sectors per cluster"
uint16      "unused"
hex 3"zero"
hex 10"unused"
int64        "total sectors"
int64        "mft"
int64        "mftmirr"
byte"file record"
hex 100"......"
end
  ⾃定义模板的应⽤:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。