2005-3-18 15:12
zhubob
主要针对csta协议使用
2005-3-18 16:13
无双
如果想自己写 那就研究它的语法<br /><br />如果不想自己写那就找现成的库<br /><br />asn1好像在snmp上有应用吧 所以找应该还是可以找到很多
2005-3-18 19:45
zhubob
主要是想自己写csta标准协议的编解码,我下载过asn1的编译器,虽说可以将asn结构的描述编译成c/c++代码,但生成的代码仍然比较复杂,而且我还要将交换机返回的16进制代码信息再根据asn1规范进行解码,所以只有编译器依然达不够用,只有靠自己写了<br /><br />现将找到的部分资料共享出来,供大家探讨<br /><br />转载:<br />感悟<br />人生真是很奇妙!在你满怀希望的时候,它会出其不意的给你当头一棒;而你决定放弃时,它却意想不到的奉上希望。有时候,真的是谋事在人,成事在天。 <br />17:00 | 评论 (0) <br /><br />2004年3月27日 # <br /><br />无题<br />郁闷,这两天忙着到处找asn.1的资料,希望能找到一个报文编解码的例子,可是怎么也找不到,我从前一点都没接触过这种东西,但现在竟然要做一个asn.1报文编解码器的自动生成器!这就像一个小孩还不没学会走路,就参加赛跑比赛。<br /><br />10:23 | 评论 (3) <br /><br />2004年3月20日 # <br /><br />ASN.1 笔记<br />作者:ddonwi(ddonwi@sina.com) <br />最后修改时间:17:13 04-3-20<br />一、介绍<br />Abstract Syntax Notation One (ASN.1)是一种独立于机器的描述语言,用于描述在网络上传递的消息<br /> 标准包括: ISO 8824-1 | ITU-T X.680: Specification of basic notation, <br /> ISO 8824-2 | ITU-T X.681: Information object specification, <br /> ISO 8824-3 | ITU-T X.682: Constraint specification, <br /> ISO 8824-4 | ITU-T X.683: Parameterization of ASN.1<br />ASN.1特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构<br />ASN.1 可分为两个部分<br /> 语法规则:从数据类型、内容顺序或结构等方面来描述消息的内容<br /> 编码规则:如何编码实际消息中的数据<br />特点:<br /> 表达简单和复杂类型的能力<br /> 可对类型根据大小及(或)数值进行约束<br /> 也可以施加更强的约束<br /> 字段可标记为 OPTIONAL<br /> 大写开头表示类型名,小写开头的表示变量名/字段名<br /><br />二、ASN.1术语<br /> 1.抽象语法(Abstract Syntax)<br /> 描述通用数据结构<br /> 允许定义数据类型和值<br /> 2.数据类型(Data Type)<br /> 值的集合,可以是简单类型或结构类型<br /> 可以对数据类型命名<br /> 3.编码(Encoding)<br /> 用于表示数据值的字节序列<br /> 4.编码规则(Encoding Rules)<br /> 给出从一种语法到另一种的映射方法<br /> 5.传输语法(Transfer Syntax)<br /> 位模式(Bits pattern)<br /> 描述数据是在传输时是如何表示的<br /><br />三、ASN.1模块定义<br /> 模块(module):ASN.1规范中的基本构造块<br />模块定义格式如下:<br /><br /><modulereference> DEFINITIONS ::=<br /> BEGIN<br /> EXPORTS <br /> IMPORTS <br /> AssignmentList<br /> END<br />其中:EXPORTS 这个模块中的定义可能被其他模块引入<br /> IMPORTS 定义由其他模块引入<br /> AssignmentList 这个模块中将定义类型分配、值分配及宏定义<br /><br /><br />四、ASN.1简单类型<br /> 1. 基本类型:BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING<br /> 2. 字符串类型(ISO10646-1的子集)<br /> NumericString (0-9,<space>)<br /> PrintableString (0-9,A-Z,a-z,<space>,<s[ecial><br /> VisibleString<br /> GraphicString<br /> UTF8String<br /> IA5String (ASCII)<br /> 3. 对象类型<br /> OBJECT IDENTIFIER <br /> ObjectDescriptor 对象标识符:一个任意长的非负整数序列,用于标记对象(如算法等)<br /> 4. 其它类型<br /> NULL 空值<br /> UTCTime<br /> yymmdd hhmm[ss] <local offset from UTC><br /> GeneralizedTime<br /> yyyymmdd hhmm[ss] <local offset from UTC><br /> 强制从2050年开始<br /><br />五、ASN.1类型定义<br />语法: <type name> ::= <type><br /> 示例:<br /> Counter ::= INTEGER<br /> IpAddress ::= OCTET STRING<br /> Months ::= ENUMERATED {<br /> january (1), february (2), march (3),<br /> april (4), may (5), june (6),<br /> july (7), august (8), september (9),<br /> october (10), november (11), december(12)<br /> }<br />六、ASN.1子类型定义<br />语法: <subtype name> ::= <type> (<constraint>)<br /> 示例:<br /> Counter ::= INTEGER (0..65536)<br /> IpAddress ::= OCTET STRING ( SIZE(4) )<br /> Spring ::= Months (march | april | may)<br /> Summer ::= Months (june | july | august )<br /> SmallPrime ::= INTEGER ( 2 | 3 | 5 | 7 | 11 )<br /> ExportKey ::= BIT STRING ( SIZE(40) )<br /><br /><br />七、ASN.1赋值<br />语法: <value name> <type> ::= <value><br /> 示例:<br /> ipInReceives Counter ::= 2450<br /> ipRouteMask IpAddress ::= ‘FFFFFF00’H<br /> currentMonth Months ::= july<br /> currentTime UTCTime ::= “030708094018+0800”<br /> name VisibleString ::= “John”<br /> married BOOLEAN ::= TRUE<br /> faxMessage BIT STRING ::= ‘01100001101’B<br /><br /> internet OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 }<br /> private OBJECT IDENTIFIER ::= { internet 4 }<br /><br />八、ASN.1结构类型<br /> SEQUENCE 对应于C语言中的struct<br /> 类型定义<br /> UserAccount ::= SEQUENCE {<br /> username PrintableString,<br /> password PrintableString,<br /> accountNr INTEGER<br /> }<br /> 赋值<br /> myAccount UserAccount ::= {<br /> username “tly”,<br /> password “guesswhat”,<br /> accountNr 2345<br /> }<br /> SEQUENCE OF 对应于C语言中的数组<br /> 类型定义<br /> MemberCountries ::= SEQUENCE OF PrintableString<br /> AccountRegistry ::= SEQUENCE OF UserAccount<br /> 赋值<br /> eastAsia MemberCountries ::= {<br /> “China”, “Japan”, “Korean”, “DPR”<br /> }<br /> SET 类似于SEQUENCE,但不考虑分量顺序<br /> 类型定义<br /> UserAccount ::= SET {<br /> username [0] PrintableString,<br /> password [1] PrintableString,<br /> accountNr [2] INTEGER<br /> }<br /> 赋值<br /> myAccount UserAccount ::= {<br /> accountNr 2345,<br /> username “tly”,<br /> password “guesswhat”<br /> }<br /> SET OF 集合类型,每一分量类型相同,不考虑顺序<br /> 类型定义<br /> Keywords ::= SET OF PrintableString<br /> 赋值<br /> someASN1Keywords Keywords ::= {<br /> “INTEGER”, “BOOLEAN”, “REAL”<br /> }<br /><br /><br />15:10 | 评论 (2) <br /><br />ASN.1介绍<br />出处:http://asn1.elibel.tm.fr/en/introduction/index.htm<br />翻译:ddonwi(ddonwi@sina.com) <br />说明:我是第一次接触ASN.1,不知道它是什么东东,所以找了这份资料,边读边翻译,希望高手能通过这篇指出我理解上存在的错误,让我能够正确的理解ASN.1<br />最后修订日期:2004.3.20<br /><br />主要概念<br /><br />ASN.1 是通信协议中描述数据传输的正式标记(notation),它与语言实现和物理表示无关,与应用的复杂度无关。<br /><br />ASN.1(Abstract Sysntax Notation number One 抽象语法标记)是定义抽象数据类型规格形式的标准。 <br /><br /><br />它提供了一系列预定义的基本类型,诸如:<br />integers (INTEGER), <br />booleans (BOOLEAN), <br />character strings (IA5String, UniversalString...), <br />bit strings (BIT STRING), <br />...<br />并且它可以定义结构类型,比如:<br />structures (SEQUENCE), <br />lists (SEQUENCE OF), <br />choice between types (CHOICE), <br />...<br /><br />子类型(Subtyping)约束也可以应用于任何ASN.1类型,用来限制类型的值的范围。<br /><br />与很多其他的声称可扩展的语法不同,ASN.1 提供了处理和支持早期配置系统与新系统、新版本与老版本之间交互的可扩展性。<br /><br />ASN.1 发送任何形式(音频、视频、数据等等)的信息都必须用数字传送。ASN.1只能包含信息的结构方面(没有已经定义的或考虑到的处理数据值的操作)。它不是一个编程语言。<br /><br /> ASN.1成功的一个主要理由是它采用了一些如BER(Basic Encoding Rules) 或新制定的PER(Packed EncodingRules)这样的标准化的编码规则,它对受带宽限制的应用程序很有用。这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码(例如:他们可以被转化为可传输的字节,或反向转化),其与机器、编程语言或者在应用程序中的表示无关。ASN.1的编码方式比很多竞争者更先进,能够快速并可靠的传输可扩展信息--这是无线带宽的一个优势。由于从1982年以后ASN.1已经成为一个国际标准,所以它的编码规则是成熟的并且它有长期的可靠性和互用性的跟踪记录。<br /><br />几乎所有操作系统上的工具都支持ASN.1,ASN.1也支持如java,c和c++这样流行的编程语言,和包括COBOL这样的较老的编程语言。ASN.1的广泛性的一个例子是,有很多工具已经支持超过150种不同的计算机平台。<br /> <br />有大量经过检验的ASN.1工具已经被长期使用。使用这些工具,可以更快的将新产品带入市场,至少,可以召回那些没有经过有效测试的基于新代码的产品。<br /> <br />个案研究<br /><br />假如一个公司拥有一个连接了数个销售网点的仓库,进货保存在这个仓库里 ,出货从这个仓库中调出。这个公司需要一个具有以下特征的协议:<br />定单收集在本地销售网点处;<br />它们被发送到仓库,在那里管理着交付货物手续;<br />通过客户的要求,交付的回执必须送回销售网点做下一步处理。<br /><br />协议可以被表示为下列的两个ASN.1模块:<br /> <br /> Module-order DEFINITIONS AUTOMATIC TAGS ::=<br />BEGIN<br /><br />Order ::= SEQUENCE {<br /> header Order-header,<br /> items SEQUENCE OF Order-line}<br /><br />Order-header ::= SEQUENCE {<br /> number Order-number,<br /> date Date,<br /> client Client,<br /> payment Payment-method }<br /><br />Order-number ::= NumericString (SIZE (12))<br /><br />Date ::= NumericString (SIZE (8)) -- MMDDYYYY<br /><br />Client ::= SEQUENCE {<br /> name PrintableString (SIZE (1..20)),<br /> street PrintableString (SIZE (1..50)) OPTIONAL,<br /> postcode NumericString (SIZE (5)),<br /> town PrintableString (SIZE (1..30)),<br /> country PrintableString (SIZE (1..20))<br /> DEFAULT default-country }<br />default-country PrintableString ::= "France"<br /><br />Payment-method ::= CHOICE {<br /> check NumericString (SIZE (15)),<br /> credit-card Credit-card,<br /> cash NULL }<br /><br />Credit-card ::= SEQUENCE {<br /> type Card-type,<br /> number NumericString (SIZE (20)),<br /> expiry-date NumericString (SIZE (6)) -- MMYYYY -- }<br /><br />Card-type ::= ENUMERATED { cb(0), visa(1), eurocard(2),<br /> diners(3), american-express(4) }<br /><br />Order-line ::= SEQUENCE {<br /> item-code Item-code,<br /> label Label,<br /> quantity Quantity,<br /> price Cents }<br /><br />Item-code ::= NumericString (SIZE (7))<br /><br />Label ::= PrintableString (SIZE (1..30))<br /><br />Quantity ::= CHOICE { unites INTEGER,<br /> millimetres INTEGER,<br /> milligrammes INTEGER }<br /><br />Cents ::= INTEGER<br /><br />Delivery-report ::= SEQUENCE {<br /> order-code Order-number,<br /> delivery SEQUENCE OF Delivery-line }<br /><br />Delivery-line ::= SEQUENCE { item Item-code,<br /> quantity Quantity }<br /><br />END<br /><br />Protocol DEFINITIONS AUTOMATIC TAGS ::=<br />BEGIN<br />IMPORTS Order, Delivery-report, Item-code, Quantity, <br /> Order-number FROM Module-order ;<br /><br />PDU ::= CHOICE { question CHOICE { <br /> question1 Order,<br /> question2 Item-code,<br /> question3 Order-number,<br /> ... },<br /> answer CHOICE {<br /> answer1 Delivery-report,<br /> answer2 Quantity,<br /> answer3 Delivery-report,<br /> ... }}<br />END<br /><br /><br />15:06 | 评论 (1) <br /><br />2004年3月18日 # <br /><br /><br /><br />****************************************<br />另外附件中是asn1的开源代码,有lience的<br /><br />请高手指点<br /><br />
2005-3-18 21:24
无双
看了 是一种抽象的文法表示工具<br /><br />如果是想自己开发完全支持这些文法的话 代码量估计应该是1个月/人<br /><br />所以 我觉得最好是找现成的库 像snmp协议等应该有对应的asn语法处理库
2005-3-19 17:44
无双
看了看<br /><br />asn1 应该只是一种描述语法<br /><br />只是描述数据类型<br /><br />与具体语言实现无关<br /><br />但是可以映射到其它语言<br /><br />如string (500) <br />这个定义了一个500个byte的string<br />这时在c中可以使用<br />char s[500] 来表述<br /><br />如果asn1语法是一定的 那对应的语言映射结果应该是一定的
2005-3-20 11:40
zhubob
比如我有以下的一个csta协议描述结构的写成asn1<br /><br />rOSE.roiv-apdu<br />{ -- SEQUENCE -- <br /> invokeID = 1, <br /> operation-value = 10 (makeCall),31 30 <br /> argument<br /> { -- SEQUENCE -- <br /> callingDevice<br /> { -- SEQUENCE -- <br /> deviceIdentifier.dialingNumber = "100" '31 30 30'H<br /> },<br /> calledDirectoryNumber<br /> { -- SEQUENCE -- <br /> deviceIdentifier.dialingNumber = "101" '31 30 31'H<br /> }<br /> }<br />}<br /><br />它实际在网络中传输的数据是<br />A1 16 02 01 01 02 01 0A 30 0E 30 05 80 03 31 30 30 30 05 80 03 31 30 31<br /><br />hex分布表<br />00000000h: 41 31 20 31 36 20 30 32 20 30 31 20 30 31 20 30 ; A1 16 02 01 01 0<br />00000010h: 32 20 30 31 20 30 41 20 33 30 20 30 45 20 33 30 ; 2 01 0A 30 0E 30<br />00000020h: 20 30 35 20 38 30 20 30 33 20 33 31 20 33 30 20 ; 05 80 03 31 30 <br />00000030h: 33 30 20 33 30 20 30 35 20 38 30 20 30 33 20 33 ; 30 30 05 80 03 3<br />00000040h: 31 20 33 30 20 33 31 ; 1 30 31<br /><br /><br />
2005-3-20 17:54
无双
rOSE.roiv-apdu<br />{ -- SEQUENCE --<br />invokeID = 1,<br />operation-value = 10 (makeCall),31 30<br />argument<br />{ -- SEQUENCE --<br />callingDevice<br />{ -- SEQUENCE --<br />deviceIdentifier.dialingNumber = "100" '31 30 30'H<br />},<br />calledDirectoryNumber<br />{ -- SEQUENCE --<br />deviceIdentifier.dialingNumber = "101" '31 30 31'H<br />}<br />}<br />}<br />这个是给包里面的元素赋值了<br />要想理解包要根据原来的包结构的asn1定义来理解
2005-3-20 19:13
zhubob
将该结构变成asn1的描述结构,已经搞会了,将asn1的结构映射成c/c++的代码,在熟悉了asn1语言规范的情况下我想也不是难事,我现在困惑的是如何如何将asn1的描述结构变成一个数字码的数据流(因为无论是图象、语音、还是其它类型的用asn1描述的信息,最终进行传输的数字码数据)来进行传输,我利用cstabrower工具虽然找到了点点的规律但总体还是不知其原,这方面的资料又少的可怜,啃e文这两天啃的头的发晕,):
2005-3-20 19:15
zhubob
当然咯,当拿到交换机返回的数字码数据时,又该如何变回asn1的结构,来知道其中的某个项的信息(也就是所说asn1的解码)
2005-4-8 10:00
djh0410cq
<!--QuoteBegin-zhubob+2005-03-20 19:13:08--><div class='quotetop'>QUOTE(zhubob @ 2005-03-20 19:13:08)</div><div class='quotemain'><!--QuoteEBegin-->将该结构变成asn1的描述结构,已经搞会了,将asn1的结构映射成c/c++的代码,在熟悉了asn1语言规范的情况下我想也不是难事,我现在困惑的是如何如何将asn1的描述结构变成一个数字码的数据流(因为无论是图象、语音、还是其它类型的用asn1描述的信息,最终进行传输的数字码数据)来进行传输,我利用cstabrower工具虽然找到了点点的规律但总体还是不知其原,这方面的资料又少的可怜,啃e文这两天啃的头的发晕,):<br />[right][snapback]443113[/snapback][/right]<br /><!--QuoteEnd--></div><!--QuoteEEnd--><br /><br />zhubob兄,我也正想做一个ASN1的编译器,而且也是从头学起,看了你写的贴子,还是蛮受启发的.如何将ASN1的描述结构变成数字码流,我是这样理解的,不知对不对,共同探讨下:<br />ASN1描述文件经过编译器,要翻译成两个文件:一个是将数据类型映射成对应的C/C++的数据结构,主要是语言规则的映射,这个文件可以作头文件(.H).另一个是每种数据类型的编解码函数库(.C),比如某一个数据类型,其中包括很多项,有整型,布尔型等等,还可能是嵌套的,那么对这个数据类型要有一个编解码函数,将其中的嵌套结构拆开(或者也做成嵌套结构的可能更好),直至拆成各个简单类型的调用.对各个简单类型,可以单独做一个编解码实时库来实现编解码,即按编码规则编制成bit流,这个就比较简单了.这个实时库对任何ASN1文件的编译都是通用的,而上面编译生成的(.H)和(.C)只是一个特定的ASN1文件生成的.<br />
2005-4-8 10:01
djh0410cq
<!--QuoteBegin-zhubob+2005-03-20 19:13:08--><div class='quotetop'>QUOTE(zhubob @ 2005-03-20 19:13:08)</div><div class='quotemain'><!--QuoteEBegin-->将该结构变成asn1的描述结构,已经搞会了,将asn1的结构映射成c/c++的代码,在熟悉了asn1语言规范的情况下我想也不是难事,我现在困惑的是如何如何将asn1的描述结构变成一个数字码的数据流(因为无论是图象、语音、还是其它类型的用asn1描述的信息,最终进行传输的数字码数据)来进行传输,我利用cstabrower工具虽然找到了点点的规律但总体还是不知其原,这方面的资料又少的可怜,啃e文这两天啃的头的发晕,):<br />[right][snapback]443113[/snapback][/right]<br /><!--QuoteEnd--></div><!--QuoteEEnd--><br /><br />zhubob兄,我也正想做一个ASN1的编译器,而且也是从头学起,看了你写的贴子,还是蛮受启发的.如何将ASN1的描述结构变成数字码流,我是这样理解的,不知对不对,共同探讨下:<br />ASN1描述文件经过编译器,要翻译成两个文件:一个是将数据类型映射成对应的C/C++的数据结构,主要是语言规则的映射,这个文件可以作头文件(.H).另一个是每种数据类型的编解码函数库(.C),比如某一个数据类型,其中包括很多项,有整型,布尔型等等,还可能是嵌套的,那么对这个数据类型要有一个编解码函数,将其中的嵌套结构拆开(或者也做成嵌套结构的可能更好),直至拆成各个简单类型的调用.对各个简单类型,可以单独做一个编解码实时库来实现编解码,即按编码规则编制成bit流,这个就比较简单了.这个实时库对任何ASN1文件的编译都是通用的,而上面编译生成的(.H)和(.C)只是一个特定的ASN1文件生成的.<br />
2005-4-8 12:09
无双
偶觉得编码函数可能是直接使用sprintf生成对应的格式的 应该不复杂 <br /><br />编码函数的话asn编译器会根据指定的内容生成一个.c与.h文件
2005-4-11 09:06
djh0410cq
有没有人实际做过的,出来教教撒
2005-5-30 11:58
javantsky
实现ans.1的编解码<br />1、最好是把你的资料翻译成中文,我当年是找一个叫(davis可能记错了)的大侠要的资料,在IBM developerWorks 去找找这方面的东东。<br />2、你要熟悉它的语法、编码规则、数据结构<br />3、从简单数据结构开始实现你的编解码,因为其它的数据类型都是由基本的数据结构来实现的。<br /><br />源码恕不能提供
2005-6-9 15:37
john-xiong
各位大侠:我现在也要实现这种功能,小弟刚入此道,对此不熟呀。我想问一个问题:就是一个C++中的INT和STRING型如何转换成ASN1的格式呢。小弟手中已有写好的ASN1.H 和ASN.CPP文件,但没有具体的例子如何呀?
2005-6-9 22:20
zhubob
呵呵,有段时间没来这里了<br />asn1的编解码确实是相当复杂的,如果以前没有搞过这方面的,或者找不到这方面有经验的人来帮忙的话,建议先看看如下的资料<br />ASN1 BER DER 编码子集入门指南.pdf --翻译成中文的好象就这本书了,但翻译的效果感觉不怎么样,理解起来有点费劲,如果英文功底好的话,最好看e版的,但这本书对编码的部分讲的不怎么详细<br />另外一本书是ASN1_Complete.pdf<br />如果这两本书都读懂了话,应该对asn1比较熟了<br /><br /><br /><br />
2005-6-9 22:38
zhubob
再谈谈自己的一些看法<br />如果你想自己做asn1的编译器的话,呵呵这个难度是比较大的,一个人搞估计很需要一段时间,asn1的编码规范一定得熟悉,反而像词法、语法、语义分析等我倒认为是比较简单的事情。国内真正熟悉asn1的人不是很多,或者说就算有那么些人懂也轻易不愿意提供技术上的帮助吧,我曾经通过网上咨询过一个做过这方面的人,问他是否可以提供代码,开价比较高。<br /><br />第二中途径可以采用第三方的平台或者编译器来做<br /> 1 asn1c应该是asn1做的最好的编译器了,可以编译出c/c++/java/c#代码,不过是收费的,liense好象比较贵<br /> 2 snacc是一免费的源码编译器,比较好用,我曾经使用过,像华为的snmp方面的有些产品就是利用这个编译器做的<br /> 3 利用openssl平台来做,我也简单的试过,不过比用snacc要复杂。<br /> 我所知道就这几种方式了,建议一般的项目可以采用snacc来生成代码,不过snacc只支持c/c++<br /><br />
2005-6-10 12:09
无双
介绍的不错 谢谢zhubob共享经验 <!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo--><br /><br />
2005-6-28 12:05
gbfx
我也再作交换机的相关开发,但是现在还是0<br />bytebandit@126.com<br />我的邮件,希望可以联络上<br />另外我用的交换机是s1240 不知道你用过没有<br />
2005-7-7 12:22
zhubob
呵呵,没用过,我接触的主要是alcatel和西门子<br />
2005-9-14 13:44
zhiji
求助--用snacc编译x509(pkix88)后 测试产生的代码总不正确....<br /><br />测试产生的“证书类”代码:<br /><br />BDec 解码一个证书正确<br />print 打印内容到控制台 一切正确<br />BEnc 编码内容后 输出到二进制缓冲区 按十六进制显示<br />长度正确 但后面全是0<br />对比发现一些证书内容成员丢失(或被后面的成员覆盖)<br /><br />这可能是怎么回事 在windows下<br /><br />my Email zhiji@163.com
2006-3-20 11:46
lif_1978
我搞了一段时间asn.1的解码,编码还没有细想,但是应该跟解码思路正好相反,我现在的解码算法是将数据流生成一棵树,遍历树去查找结点,编码吗,我觉得应该也应该是建一棵树,遍历树生成数据流,下阶段有空的话我会进行研究,如果现在有谁对编码这块有一定了解可以相互交流一下。
2006-4-29 10:51
qfxx
各位大虾好,本人正在做ASN1的解码
很乱没什么头绪,希望楼上的能留个联系方式一起讨论
本人MSN:[email]harryhurry.wang@gmail.com[/email]
谢谢!
2007-10-3 11:51
lif_1978
asn.1解码我的处理方法是这样的
1、先将数据流生成树结构,可以使用递归算法和非递归算法,非递归算法需要使用堆栈,即分别建立放置父节点和子节点的堆栈。
2、对树遍历,定位需要的节点,一般使用回溯算法得到记录节点,再从记录节点开始根据construct type找叶子节点
这里面需要注意的是,建树的节点如果考虑性能,可以先分配足够的节点,再不断重复使用这些节点,而且所有的值可以用指针指向数据流缓冲区,不用拷贝到树结构节点中,在确定要这个数据再拷贝到变量,这样可以大大提高性能,但是记住,取到数据前不能清除数据流缓冲区,否则程序就core了
页:
[1]
2
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.