我们考察一个非负数的四种形式的编码,因为自然数常出现在长度域L、bitmap的大小、CHOICE中的序号以及INTEGER类型边界中。
对于INTEGER类型,PER可见约束之一是值域约束。对于有值域约束(bmin..bmax)的值n,如果下边界bmin足够大,PER编码n- bmin的代价就更小。如下: Figure 3-26 有约束自然数的基本编码规则
I. 有约束数编码
有约束指值域的上、下边界都有限。如果d=1,即只有一个值,则收、发双方都知道,那么就没有编码的必要。
在对齐方式下:∞
l 当2≤d≤255,n- bmin的编码占用log2d个比特。这些比特添加在待发送比特域之后,不进行八位组对齐,不编码L;
l 当d=256,n- bmin的编码占用一个八位组,不编码L;
l 当257≤d≤65,536,n- bmin的编码占用两个八位组,不编码L;
l 当65,537≤d,n- bmin的编码占用log256d个八位组,并且在前面增加L的编码。
在不对齐方式下:
n- bmin的编码占用log2d个比特,不编码L。
II. 半约束数编码
半约束指值域没有上边界(上边界为+∞)。
n- bmin的编码占用log256d个八位组,并且在前面增加L的编码。
III. 无约束数编码
无约束指值域没有下边界(即使存在上边界)。
按照BER中整数的编码方式编码,并且在前面增加L的编码。
IV. 常见小自然数编码
这种情况经常出现在对表征SEQUENCE、SET类型可选成员的Bitmap长度进行编码时;或者CHOICE类型序号编码时。这种长度相当小,但是却没有一种限定。
l 当0≤n≤63时,n以6个比特编码,并且在前面增加一个0比特(八位组不对齐):
l 当64≤n时,n以半约束数方式编码,下边界为0,并且在前面增加一个1比特: 3.3.5 长度域编码
与BER中长度域表征编码的八位组数不同,在PER的长度域出现下,如果编码为比特串则表征比特位数;如果编码为八位组串(OCTET STRING和open类型)则表征八位组个数;如果编码为known-multiplier character string则表征字符数;如果是SEQUENCE OF或者SET OF则表征成员个数。
每当ASN.1描述中对类型通过(SIZE(lmin..lmax))做大小限定时(lmax可以是+∞),长度l的值要按照3.3.4 中的规则编码。作为特例,当lmin =lmax≤65,535时,长度不需要发送,因为解码器知道该长度。
对齐方式下:
l 当l是一个bitmap的长度,l-1作为常见小自然数编码;
l 当lmax≤65,535,l作为有约束的数编码(约束为(lmin..lmax));
l 当65,535≤lmax,或者lmax是无穷大:
-当l≤127,l以一个八位组编码(八位组对齐),最高比特位为0;
-当128≤l≤16,383,l以两个八位组编码(八位组对齐),最高两个比特位为10;
-当16,384≤l,整个编码以f*16K为单位分割(f取值为1,2,3或者4)。除最后的片段外,其余每段,长度都以一个八位组编码,最高两个比特位为11。如果编码恰好时16K的整倍数,则在最后补充一个全空的八位组;否则最后一个片段按照前两条进行编码。例如占147,457个单元的编码可以为:
不对齐方式下:
l 当l是一个bitmap的长度,l-1作为常见小自然数编码;
l 当lmax≤65,535,l-lmin以占用log2(lmin-lmax+1)个比特编码;
l 当65,534≤lmax-lmin,或者上边界为无穷大:
-当l≤127,l以八比特编码,最高比特位为0;
-当128≤l≤16,383,l以十六比特编码,最高两个比特位为10;
-当16,384≤l,编码方式域对齐类似,但是不是八位组对齐的。