一种Asn.1编码的快速读码方法转让专利

申请号 : CN201110279914.2

文献号 : CN102332018B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王林杨祎

申请人 : 西安理工大学

摘要 :

本发明公开一种Asn.1编码的快速读码方法,首先按照Asn.1编码规则读取编码的标识符八位位组,判读该八位位组是否为空闲字段,若不为空闲字段,则按照Asn.1编码规则读取该编码信息的长度八位位组,再根据得到的字节长度信息,读取相应字节长度的编码信息后,返回并读取下一条编码信息。否则,预设空闲字段字节长度的初始值为一固定值,最终确定空闲字段的实际长度,再从上一条编码信息的最后一个字节开始跳过相应长度的字节,再返回读取下一条编码信息。本发明解决了现有读码过程中需要依次判断字节是否为空闲字段的方法,能快速确定空闲字段的实际长度,大大提高了读码速度。

权利要求 :

1.一种Asn.1编码的快速读码方法,其特征在于,包括以下步骤:

步骤1、按照Asn.1编码规则读取编码信息的标识符八位位组,并判读该八位位组是否为空闲字段,若不为空闲字段,则进入步骤2,否则,进入步骤3;

步骤2、按照Asn.1编码规则读取该编码信息的长度八位位组,以得到该编码信息的字节长度信息,再根据得到的字节长度信息,读取相应字节长度的编码信息后,返回步骤1并读取下一条编码信息;

步骤3、预设空闲字段字节长度D的初始值为一固定值L,读取该条编码信息的前L个字节并判断读取的字节是否全部为空闲字段;若读取的字节不全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/q,再读取该编码信息的前L/q个字节并判断读取的字节是否全部为空闲字段;若读取的字节不全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/2q,读取该编码信息的前L/2q个字节并判断读取的字节是否全部为空闲字段;依次类推,预设空闲字段字节长度D的取值的调整规律为依次呈倍数递减,直至读取的字节全部为空闲字段,此时预设空闲字段字节长度D取值L/nq,进入步骤4,其中,L、q和n均为正整数,且L为q的倍数,n=1,2,3…;

步骤4、读取该条编码信息的前L/nq+d个字节并判断读取的字节是否全部为空闲字段;若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+2d,读取该条编码信息的前L/nq+2d个字节并判断读取的字节是否全部为空闲字段;若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+3d,读取该条编码信息的前L/nq+3d个字节并判断读取的字节是否全部为空闲字段;依次类推,预设空闲字段字节长度D取值的调整规律为依次等差增加,直至读取的字节不全部为空闲字段,此时预设空闲字段字节长度D取值L/nq+md,进入步骤5,其中,m和d均为正整数,m=1,2,3…;

步骤5、读取该条编码信息的前L/nq+(m-1)d+1个字节并判断读取的字节是否全部为空闲字段,若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+(m-1)d+2,读取该条编码信息的前L/nq+(m-1)d+2个字节并判断读取的字节是否全部为空闲字段,若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+(m-1)d+3,依次类推,预设空闲字段字节长度D取值的调整规律为依次增加,直至读取的字节不全部为空闲字段,此时预设空闲字段字节长度D取值为L/nq+(m-1)d+z,此时,确定实际空闲字段字节长度为L/nq+(m-1)d+z-1;其中,z为正整数,z=1,2,3…;

步骤6、根据步骤5得到的实际空闲字段字节长度的数值,从上一条编码信息的最后一个字节开始跳过L/nq+(m-1)d+z-1个字节的空闲字段,再返回至步骤1读取下一条编码信息。

2.按照权利要求1所述的Asn.1编码的快速读码方法,其特征在于,步骤3中,q取值为2。

说明书 :

一种Asn.1编码的快速读码方法

技术领域

[0001] 本发明属于计算机编码数据处理技术领域,具体涉及一种Asn.1编码的快速读码方法。

背景技术

[0002] Asn.1(Abstract Syntax Notation One)编码是定义抽象数据类型规格形式的标准,是用于描述数据的表示、编码、传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。Asn.1编码是通信协议中描述数据传输的正式标记,它与语言实现和物理表示无关,与应用的复杂度无关,尤其适合表示现代通信应用中那些复杂的、变化的和可扩展的数据结构。Asn.1编码的每条编码信息之间相互独立,解码时互不影响,因此在两条编码信息中间插入若干字节完全相同的数据如FF或00,这些数据不包含任何信息且不会影响对信息的正确解码,通常称之为空闲字段。在程序进行解码读码时,如何快速的跳过空闲字段,继续对后续编码信息进行读码和解码,是非常重要的。
[0003] 目前处理方法是在读码过程中,对每个字节进行逐个判断以确定是否是空闲字段,实际判断次数等于空闲字段的字节数,因此当两个编码信息之间的空闲字段较长时,读码效率非常低下。因此通过一种快速、可靠的读码方法能快速确定编码信息之间空闲字段的长度,使读码效率不会因空闲字段字节长度变化而受到明显影响,在Asn.1解码中显得尤为重要。

发明内容

[0004] 本发明的目的是提供一种Asn.1编码的快速读码方法,解决了现有读码过程中需要逐个判断字节是否为空闲字段的方法,能快速确定空闲字段的实际长度,大大提高了读码速度。
[0005] 本发明所采用的技术方案是,一种Asn.1编码的快速读码方法,其特征在于,包括以下步骤:
[0006] 步骤1、按照Asn.1编码规则读取编码的标识符八位位组,并判读该八位位组是否为空闲字段,若不为空闲字段,则进入步骤2,否则,进入步骤3;
[0007] 步骤2、按照Asn.1编码规则读取该编码信息的长度八位位组,以得到该编码信息的字节长度信息,再根据得到的字节长度信息,读取相应字节长度的编码信息后,返回步骤1并读取下一条编码信息;
[0008] 步骤3、预设空闲字段字节长度D的初始值为一固定值L,读取该条编码信息的前L个字节并判断读取的字节是否全部为空闲字段;若读取的字节不全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/q,再读取该编码信息的前L/q个字节并判断读取的字节是否全部为空闲字段;若读取的字节不全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/2q,读取该编码信息的前L/2q个字节并判断读取的字节是否全部为空闲字段;依次类推,预设空闲字段字节长度D的取值的调整规律为依次呈倍数递减,直至读取的字节全部为空闲字段,此时预设空闲字段字节长度D取值L/nq,进入步骤4,其中,L、q和n均为正整数,且L为q的倍数,n=1,2,3...;
[0009] 步骤4、读取该条编码信息的前L/nq+d个字节并判断读取的字节是否全部为空闲字段;若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+2d,读取该条编码信息的前L/nq+2d个字节并判断读取的字节是否全部为空闲字段;若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+3d,读取该条编码信息的前L/nq+3d个字节并判断读取的字节是否全部为空闲字段;依次类推,预设空闲字段字节长度D取值的调整规律为依次等差增加,直至读取的字节不全部为空闲字段,此时预设空闲字段字节长度D取值L/nq+md,进入步骤5,其中,m和d均为正整数,m=1,2,3...;
[0010] 步骤5、读取该条编码信息的前L/nq+(m-1)d+1个字节并判断读取的字节是否全部为空闲字段,若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+(m-1)d+2,读取该条编码信息的前L/nq+(m-1)d+2个字节并判断读取的字节是否全部为空闲字段,若读取的字节全部为空闲字段,则将预设空闲字段字节长度D的取值调整为L/nq+(m-1)d+3,依次类推,预设空闲字段字节长度D取值的调整规律为依次增加,直至读取的字节不全部为空闲字段,此时预设空闲字段字节长度D取值为L/nq+(m-1)d+z,此时,确定实际空闲字段字节长度为L/nq+(m-1)d+z-1;其中,z为正整数,z=1,2,3...;
[0011] 步骤6、根据步骤5得到的实际空闲字段字节长度的数值,从上一条编码信息的最后一个字节开始跳过L/nq+(m-1)d+z-1个字节的空闲字段,再返回至步骤1读取下一条编码信息。
[0012] 步骤3中,q取值为2。
[0013] 本发明方法首先预设Asn.1编码中相邻两条编码信息之间的空闲字段字节长度,再根据读入字节是否为空闲字段,通过依次呈倍数递减和依次等差增加两种规则调整空闲字段字节长度,通过较少的读取判断次数最终确定实际的空闲字段字节长度,所需的判断次数与现有逐个字节判断次数相比大大减少,在空闲字段字节长度大时效果更加明显。因此,本发明方法简单,结果可靠,能很大程度提高Asn.1编码的读码和解码速度。

附图说明

[0014] 图1是利用本发明方法进行读码(L=1024且d=16)的字节判断次数示意图;
[0015] 图2是利用本发明方法进行读码(L=512且d=16)的字节判断次数示意图;
[0016] 图3是利用本发明方法进行读码(L=1024且d=8)的字节判断次数示意图。

具体实施方式

[0017] 下面结合附图和具体实施方式对本发明进行详细说明。
[0018] Asn.1编码信息的一个字节为一个八位位组,且第一个字节为标示符八位位组,第二个字节为标示该编码信息字节长度信息的长度八位位组。本发明方法首先按照Asn.1编码规则读取编码的标识符八位位组,并判读该八位位组是否全部为0或F,若不全部为0或F,则判断不是空闲字段而是编码信息,则进入步骤2,进入步骤2后,按照Asn.1编码规则读取该编码信息的长度八位位组,得到该编码信息的字节长度信息,再根据得到的字节长度信息,读取相应字节长度的编码信息后,返回步骤1并读取下一条编码信息。如果该标识符八位位组全部为0或F,则判断为空闲字段,进入步骤3,在步骤3中预设空闲字段字节长度D的初始值为一固定值,经过步骤3、步骤4和步骤5的数值调整,最终确定两条编码信息之间的实际空闲字段字节长度,在步骤6中,上一条编码信息的最后一个字节开始跳过相应长度的字节,再返回至步骤1读取下一条编码信息。
[0019] 实施例
[0020] 本实施例中空闲字段实际长度为546个字节,L=1024,d=16时,Asn.1编码的快速读码方法为:
[0021] 步骤1、按照Asn.1编码规则读取编码的标识符八位位组,并判读该八位位组是否为空闲字段,若不为空闲字段,则进入步骤2,否则,进入步骤3;
[0022] 步骤2、按照Asn.1编码规则读取该编码信息的长度八位位组,以得到该编码信息的字节长度信息,再根据得到的字节长度信息,读取相应字节长度的编码信息后,返回步骤1并读取下一条编码信息;
[0023] 步骤3、预设空闲字段字节长度D为一固定值L,L=1024,读取该条编码信息的前1024个字节并判断读取的字节是否全部为空闲字段;由于读取的字节不全部为空闲字段,将预设空闲字段字节长度D的取值调整为L/q,q=2,L/q=1024/2=512,再读取该编码信息的前512个字节并判断读取的字节是否全部为空闲字段;由于该512个字节全部为空闲字段,此时D取值为512,此时,n=2,进入步骤4;
[0024] 步骤4、读取该条编码信息的前L/nq+d个字节并判断读取的字节是否全部为空闲字段,d=16,L/nq+d=512+16=528;若读取的字节全部为空闲字段,则将D取值调整为L/nq+2d=528+16=544,读取该条编码信息的前544个字节并判断读取的字节是否全部为空闲字段;由于该读取的544个字节全部为空闲字段,则将D取值调整为L/nq+3d=560,读取该条编码信息的前560个字节并判断读取的字节是否全部为空闲字段,由于读取的该560个字节不全部为空闲字段,此时D取值为560,进入步骤5,其中,m=3;
[0025] 步骤5、读取该条编码信息的前L/nq+(m-1)d+1=560-16+1=545个字节并判断读取的字节是否全部为空闲字段,由于读取的字节全部为空闲字段,则将D取值调整为546,读取该条编码信息的前546个字节并判断读取的字节是否全部为空闲字段,由于读取的字节全部为空闲字段,则将D取值调整为547,由于读取的字节不全部为空闲字段,此时D取值为547,最后确定实际空闲字段字节长度为L/nq+(m-1)d+z-1=546,此时,z=3;
[0026] 步骤6、根据步骤5得到的实际空闲字段字节长度为546,从上一条编码信息的最后一个字节开始跳过546个字节的空闲字段,再返回至步骤1读取下一条编码信息。
[0027] 如图1至图3所示,为利用本发明方法进行Asn.1编码的快速读码方法进行的实验结果示意图,图中横坐标为实际的空闲字段字节长度,纵坐标为读码过程中需要读入字节继而判断是否为空闲字段的次数,其中,图1中,取L=1024且d=16,图2中取L=512且d=16,图3中取L=1024且d=8。
[0028] 由图1和图2对比可得,当d一定时,L越小,对于空闲字段字节长度大的编码字节判断次数越多,对于空闲字段字节长度小的编码字节判断次数越少。因此,为了减少判断次数以实现本方法的快捷性,当空闲字段的长度普遍较小时,应将L取值相对较小;反之,当空闲字段的长度普遍较大时,应将L取值相对较大。由图1和图3对比可得,在实际空闲字段字节长度稍大于预设空闲字段字节长度的初始取值L时,d取值越小,需要判断的次数越多,因此,当编码中多个空闲字段的长度较为集中时,可将d取值相对较小,反之应将d取值相对较大。