-
Notifications
You must be signed in to change notification settings - Fork 1
表达式用于将报文元素的有关信息通过指定的方式计算出来后传给相应的参数段以输出到报文流中。在kyou中一共定义了四种数据类型:
- 报文节点
- 字符串
- 整数
- 字节数组
表达式获取一个值,经过计算之后输出另一个值。多个表达式可以串联在一起,但每个表达式的输出类型必须和后面表达式的输入类型一致。
表达式用于计算样式字符串中的参数。对于参数的表达式来说,整体的输入永远是当前正被组包的报文节点(即报文节点类型),整体的输出永远应当是字节数组类型。否则在加载组包样式时会报错。
所以在使用表达式时,您需要关注使用的每一个表达式的输入类型和输出类型,确保前后匹配,并且整体的输入是报文节点类型,输出是字节数组类型。
先举一个例子,假设我们有下面一条组包样式:
<style match="field"> <format>%=%\r\n</format> <param>s2b.GBK n</param> <param>s2b.GBK v</param> </style>
这个样式描述的是对于一个报文域,我们应当先输出域的名称,再输出一个等号,再输出域的值,最后给出回车换行。
-
n表示求报文节点的名称。在示例中,这个表达式因为位于表达式的末尾,所以得到的输入是正被组包的报文节点,输出的是这个报文节点的名称; -
v表示求报文域的值。这个表达式同样位于表达式的末尾,它的输出是报文域的值; -
s2b.GBK表示将字符串转为字节,采用GBK编码。
很多情况下,表达式除了输入和输出之外还需要其它的参数。
例如s2b这个表达式,用于将一个字符串转为字节数组,此时它就需要知道应当以何种编码对字符串进行编码。
对于这种情况,我们在其后面以后缀的方式加上编码的名称,中间以小数点分隔。如果后缀满足报文节点名称的命名规范,则可以直接写在后面,否则应当表示为一个字符串形式,前后用单引号括起来。 例子如下:
- s2b.GBK
- s2b.utf-8
- s2b.'不存在的编码在运行时一定会报错的'
再例如对于aligns这个表达式来说,它表示的是对字符串执行对齐操作,所以它必须知道要将字符串对齐到左边还是右边,宽度是多少,填充字符是什么。简单后缀已经无法满足如此复杂的需求。
对于这种需求比较复杂的表达式,我们可以采用复杂后缀的写法:
aligns[align='r',padding=' ',len='30‘]
表示将字符串右对齐,以空格填充,长度为30个字符。
其中,aligns是表达式的名称,align、padding和len为后缀的名称,由aligns定义。'r'、' '、'30'为向表达式传递的值。提供的值必须以字符串形式给出。
每个表达式都有其独特的对后缀的要求,在使用时需要查阅该表达式具体的文档。
原则上,表达式的名称追求尽可能地简短。
另外,kyou习惯使用表达式的最后一个字符来表示表达式要求输入的数据类型。i表示整数,s表示字符串,b表示字节数组,报文节点则没有什么固定的字符。相对地,输入为报文节点的表达式则通常只有一个字符。
例如,aligns表示对字符串执行对齐操作,lens表示对字符串执行求长度操作,n表示求报文节点的名称,p表示求报文节点的父节点。