本版版主招募中

 
标题: 如何实现asn1的编解码???
zhubob
LU幼天使
Rank: 2



UID 28291
精华 1
积分 28
帖子 52
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 20
注册 2004-12-15
 
发表于 2005-3-18 15:12  资料  个人空间  短消息  加为好友 
主要针对csta协议使用

顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-3-18 16:13  资料  个人空间  主页 短消息  加为好友 
如果想自己写 那就研究它的语法

如果不想自己写那就找现成的库

asn1好像在snmp上有应用吧 所以找应该还是可以找到很多





不要问我结果 我只研究过程与思路
无双客栈
顶部
zhubob
LU幼天使
Rank: 2



UID 28291
精华 1
积分 28
帖子 52
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 20
注册 2004-12-15
 
发表于 2005-3-18 19:45  资料  个人空间  短消息  加为好友 
主要是想自己写csta标准协议的编解码,我下载过asn1的编译器,虽说可以将asn结构的描述编译成c/c++代码,但生成的代码仍然比较复杂,而且我还要将交换机返回的16进制代码信息再根据asn1规范进行解码,所以只有编译器依然达不够用,只有靠自己写了

现将找到的部分资料共享出来,供大家探讨

转载:
感悟
人生真是很奇妙!在你满怀希望的时候,它会出其不意的给你当头一棒;而你决定放弃时,它却意想不到的奉上希望。有时候,真的是谋事在人,成事在天。
17:00 | 评论 (0)

2004年3月27日 #

无题
郁闷,这两天忙着到处找asn.1的资料,希望能找到一个报文编解码的例子,可是怎么也找不到,我从前一点都没接触过这种东西,但现在竟然要做一个asn.1报文编解码器的自动生成器!这就像一个小孩还不没学会走路,就参加赛跑比赛。

10:23 | 评论 (3)

2004年3月20日 #

ASN.1 笔记
作者:ddonwi(ddonwi@sina.com)
最后修改时间:17:13 04-3-20
一、介绍
Abstract Syntax Notation One (ASN.1)是一种独立于机器的描述语言,用于描述在网络上传递的消息
标准包括: ISO 8824-1 | ITU-T X.680: Specification of basic notation,
ISO 8824-2 | ITU-T X.681: Information object specification,
ISO 8824-3 | ITU-T X.682: Constraint specification,
ISO 8824-4 | ITU-T X.683: Parameterization of ASN.1
ASN.1特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构
ASN.1 可分为两个部分
语法规则:从数据类型、内容顺序或结构等方面来描述消息的内容
编码规则:如何编码实际消息中的数据
特点:
表达简单和复杂类型的能力
可对类型根据大小及(或)数值进行约束
也可以施加更强的约束
字段可标记为 OPTIONAL
大写开头表示类型名,小写开头的表示变量名/字段名

二、ASN.1术语
1.抽象语法(Abstract Syntax)
描述通用数据结构
允许定义数据类型和值
2.数据类型(Data Type)
值的集合,可以是简单类型或结构类型
可以对数据类型命名
3.编码(Encoding)
用于表示数据值的字节序列
4.编码规则(Encoding Rules)
给出从一种语法到另一种的映射方法
5.传输语法(Transfer Syntax)
位模式(Bits pattern)
描述数据是在传输时是如何表示的

三、ASN.1模块定义
模块(module):ASN.1规范中的基本构造块
模块定义格式如下:

<modulereference> DEFINITIONS ::=
BEGIN
EXPORTS
IMPORTS
AssignmentList
END
其中:EXPORTS 这个模块中的定义可能被其他模块引入
IMPORTS 定义由其他模块引入
AssignmentList 这个模块中将定义类型分配、值分配及宏定义


四、ASN.1简单类型
1. 基本类型:BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING
2. 字符串类型(ISO10646-1的子集)
NumericString (0-9,<space>)
PrintableString (0-9,A-Z,a-z,<space>,<s[ecial>
VisibleString
GraphicString
UTF8String
IA5String (ASCII)
3. 对象类型
OBJECT IDENTIFIER
ObjectDescriptor 对象标识符:一个任意长的非负整数序列,用于标记对象(如算法等)
4. 其它类型
NULL 空值
UTCTime
yymmdd hhmm[ss] <local offset from UTC>
GeneralizedTime
yyyymmdd hhmm[ss] <local offset from UTC>
强制从2050年开始

五、ASN.1类型定义
语法: <type name> ::= <type>
示例:
Counter ::= INTEGER
IpAddress ::= OCTET STRING
Months ::= ENUMERATED {
january (1), february (2), march (3),
april (4), may (5), june (6),
july (7), august (8), september (9),
october (10), november (11), december(12)
}
六、ASN.1子类型定义
语法: <subtype name> ::= <type> (<constraint>)
示例:
Counter ::= INTEGER (0..65536)
IpAddress ::= OCTET STRING ( SIZE(4) )
Spring ::= Months (march | april | may)
Summer ::= Months (june | july | august )
SmallPrime ::= INTEGER ( 2 | 3 | 5 | 7 | 11 )
ExportKey ::= BIT STRING ( SIZE(40) )


七、ASN.1赋值
语法: <value name> <type> ::= <value>
示例:
ipInReceives Counter ::= 2450
ipRouteMask IpAddress ::= ‘FFFFFF00’H
currentMonth Months ::= july
currentTime UTCTime ::= “030708094018+0800”
name VisibleString ::= “John”
married BOOLEAN ::= TRUE
faxMessage BIT STRING ::= ‘01100001101’B

internet OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 }
private OBJECT IDENTIFIER ::= { internet 4 }

八、ASN.1结构类型
SEQUENCE 对应于C语言中的struct
类型定义
UserAccount ::= SEQUENCE {
username PrintableString,
password PrintableString,
accountNr INTEGER
}
赋值
myAccount UserAccount ::= {
username “tly”,
password “guesswhat”,
accountNr 2345
}
SEQUENCE OF 对应于C语言中的数组
类型定义
MemberCountries ::= SEQUENCE OF PrintableString
AccountRegistry ::= SEQUENCE OF UserAccount
赋值
eastAsia MemberCountries ::= {
“China”, “Japan”, “Korean”, “DPR”
}
SET 类似于SEQUENCE,但不考虑分量顺序
类型定义
UserAccount ::= SET {
username [0] PrintableString,
password [1] PrintableString,
accountNr [2] INTEGER
}
赋值
myAccount UserAccount ::= {
accountNr 2345,
username “tly”,
password “guesswhat”
}
SET OF 集合类型,每一分量类型相同,不考虑顺序
类型定义
Keywords ::= SET OF PrintableString
赋值
someASN1Keywords Keywords ::= {
“INTEGER”, “BOOLEAN”, “REAL”
}


15:10 | 评论 (2)

ASN.1介绍
出处:http://asn1.elibel.tm.fr/en/introduction/index.htm
翻译:ddonwi(ddonwi@sina.com)
说明:我是第一次接触ASN.1,不知道它是什么东东,所以找了这份资料,边读边翻译,希望高手能通过这篇指出我理解上存在的错误,让我能够正确的理解ASN.1
最后修订日期:2004.3.20

主要概念

ASN.1 是通信协议中描述数据传输的正式标记(notation),它与语言实现和物理表示无关,与应用的复杂度无关。

ASN.1(Abstract Sysntax Notation number One 抽象语法标记)是定义抽象数据类型规格形式的标准。


它提供了一系列预定义的基本类型,诸如:
integers (INTEGER),
booleans (BOOLEAN),
character strings (IA5String, UniversalString...),
bit strings (BIT STRING),
...
并且它可以定义结构类型,比如:
structures (SEQUENCE),
lists (SEQUENCE OF),
choice between types (CHOICE),
...

子类型(Subtyping)约束也可以应用于任何ASN.1类型,用来限制类型的值的范围。

与很多其他的声称可扩展的语法不同,ASN.1 提供了处理和支持早期配置系统与新系统、新版本与老版本之间交互的可扩展性。

ASN.1 发送任何形式(音频、视频、数据等等)的信息都必须用数字传送。ASN.1只能包含信息的结构方面(没有已经定义的或考虑到的处理数据值的操作)。它不是一个编程语言。

ASN.1成功的一个主要理由是它采用了一些如BER(Basic Encoding Rules) 或新制定的PER(Packed EncodingRules)这样的标准化的编码规则,它对受带宽限制的应用程序很有用。这些编码规则描述了如何将定义在ASN.1中的值译成适合传输的电码(例如:他们可以被转化为可传输的字节,或反向转化),其与机器、编程语言或者在应用程序中的表示无关。ASN.1的编码方式比很多竞争者更先进,能够快速并可靠的传输可扩展信息--这是无线带宽的一个优势。由于从1982年以后ASN.1已经成为一个国际标准,所以它的编码规则是成熟的并且它有长期的可靠性和互用性的跟踪记录。

几乎所有操作系统上的工具都支持ASN.1,ASN.1也支持如java,c和c++这样流行的编程语言,和包括COBOL这样的较老的编程语言。ASN.1的广泛性的一个例子是,有很多工具已经支持超过150种不同的计算机平台。

有大量经过检验的ASN.1工具已经被长期使用。使用这些工具,可以更快的将新产品带入市场,至少,可以召回那些没有经过有效测试的基于新代码的产品。

个案研究

假如一个公司拥有一个连接了数个销售网点的仓库,进货保存在这个仓库里 ,出货从这个仓库中调出。这个公司需要一个具有以下特征的协议:
定单收集在本地销售网点处;
它们被发送到仓库,在那里管理着交付货物手续;
通过客户的要求,交付的回执必须送回销售网点做下一步处理。

协议可以被表示为下列的两个ASN.1模块:

Module-order DEFINITIONS AUTOMATIC TAGS ::=
BEGIN

Order ::= SEQUENCE {
header Order-header,
items SEQUENCE OF Order-line}

Order-header ::= SEQUENCE {
number Order-number,
date Date,
client Client,
payment Payment-method }

Order-number ::= NumericString (SIZE (12))

Date ::= NumericString (SIZE (8)) -- MMDDYYYY

Client ::= SEQUENCE {
name PrintableString (SIZE (1..20)),
street PrintableString (SIZE (1..50)) OPTIONAL,
postcode NumericString (SIZE (5)),
town PrintableString (SIZE (1..30)),
country PrintableString (SIZE (1..20))
DEFAULT default-country }
default-country PrintableString ::= "France"

Payment-method ::= CHOICE {
check NumericString (SIZE (15)),
credit-card Credit-card,
cash NULL }

Credit-card ::= SEQUENCE {
type Card-type,
number NumericString (SIZE (20)),
expiry-date NumericString (SIZE (6)) -- MMYYYY -- }

Card-type ::= ENUMERATED { cb(0), visa(1), eurocard(2),
diners(3), american-express(4) }

Order-line ::= SEQUENCE {
item-code Item-code,
label Label,
quantity Quantity,
price Cents }

Item-code ::= NumericString (SIZE (7))

Label ::= PrintableString (SIZE (1..30))

Quantity ::= CHOICE { unites INTEGER,
millimetres INTEGER,
milligrammes INTEGER }

Cents ::= INTEGER

Delivery-report ::= SEQUENCE {
order-code Order-number,
delivery SEQUENCE OF Delivery-line }

Delivery-line ::= SEQUENCE { item Item-code,
quantity Quantity }

END

Protocol DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
IMPORTS Order, Delivery-report, Item-code, Quantity,
Order-number FROM Module-order ;

PDU ::= CHOICE { question CHOICE {
question1 Order,
question2 Item-code,
question3 Order-number,
... },
answer CHOICE {
answer1 Delivery-report,
answer2 Quantity,
answer3 Delivery-report,
... }}
END


15:06 | 评论 (1)

2004年3月18日 #



****************************************
另外附件中是asn1的开源代码,有lience的

请高手指点


顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-3-18 21:24  资料  个人空间  主页 短消息  加为好友 
看了 是一种抽象的文法表示工具

如果是想自己开发完全支持这些文法的话 代码量估计应该是1个月/人

所以 我觉得最好是找现成的库 像snmp协议等应该有对应的asn语法处理库





不要问我结果 我只研究过程与思路
无双客栈
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-3-19 17:44  资料  个人空间  主页 短消息  加为好友 
看了看

asn1 应该只是一种描述语法

只是描述数据类型

与具体语言实现无关

但是可以映射到其它语言

如string (500)
这个定义了一个500个byte的string
这时在c中可以使用
char s[500] 来表述

如果asn1语法是一定的 那对应的语言映射结果应该是一定的





不要问我结果 我只研究过程与思路
无双客栈
顶部
zhubob
LU幼天使
Rank: 2



UID 28291
精华 1
积分 28
帖子 52
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 20
注册 2004-12-15
 
发表于 2005-3-20 11:40  资料  个人空间  短消息  加为好友 
比如我有以下的一个csta协议描述结构的写成asn1

rOSE.roiv-apdu
{ -- SEQUENCE --
invokeID = 1,
operation-value = 10 (makeCall),31 30
argument
{ -- SEQUENCE --
callingDevice
{ -- SEQUENCE --
deviceIdentifier.dialingNumber = "100" '31 30 30'H
},
calledDirectoryNumber
{ -- SEQUENCE --
deviceIdentifier.dialingNumber = "101" '31 30 31'H
}
}
}

它实际在网络中传输的数据是
A1 16 02 01 01 02 01 0A 30 0E 30 05 80 03 31 30 30 30 05 80 03 31 30 31

hex分布表
00000000h: 41 31 20 31 36 20 30 32 20 30 31 20 30 31 20 30 ; A1 16 02 01 01 0
00000010h: 32 20 30 31 20 30 41 20 33 30 20 30 45 20 33 30 ; 2 01 0A 30 0E 30
00000020h: 20 30 35 20 38 30 20 30 33 20 33 31 20 33 30 20 ; 05 80 03 31 30
00000030h: 33 30 20 33 30 20 30 35 20 38 30 20 30 33 20 33 ; 30 30 05 80 03 3
00000040h: 31 20 33 30 20 33 31 ; 1 30 31



顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-3-20 17:54  资料  个人空间  主页 短消息  加为好友 
rOSE.roiv-apdu
{ -- SEQUENCE --
invokeID = 1,
operation-value = 10 (makeCall),31 30
argument
{ -- SEQUENCE --
callingDevice
{ -- SEQUENCE --
deviceIdentifier.dialingNumber = "100" '31 30 30'H
},
calledDirectoryNumber
{ -- SEQUENCE --
deviceIdentifier.dialingNumber = "101" '31 30 31'H
}
}
}
这个是给包里面的元素赋值了
要想理解包要根据原来的包结构的asn1定义来理解





不要问我结果 我只研究过程与思路
无双客栈
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
zhubob
LU幼天使
Rank: 2



UID 28291
精华 1
积分 28
帖子 52
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 20
注册 2004-12-15
 
发表于 2005-3-20 19:13  资料  个人空间  短消息  加为好友 
将该结构变成asn1的描述结构,已经搞会了,将asn1的结构映射成c/c++的代码,在熟悉了asn1语言规范的情况下我想也不是难事,我现在困惑的是如何如何将asn1的描述结构变成一个数字码的数据流(因为无论是图象、语音、还是其它类型的用asn1描述的信息,最终进行传输的数字码数据)来进行传输,我利用cstabrower工具虽然找到了点点的规律但总体还是不知其原,这方面的资料又少的可怜,啃e文这两天啃的头的发晕,):

顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
zhubob
LU幼天使
Rank: 2



UID 28291
精华 1
积分 28
帖子 52
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 20
注册 2004-12-15
 
发表于 2005-3-20 19:15  资料  个人空间  短消息  加为好友 
当然咯,当拿到交换机返回的数字码数据时,又该如何变回asn1的结构,来知道其中的某个项的信息(也就是所说asn1的解码)

顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
djh0410cq
LU新生
Rank: 1



UID 30900
精华 0
积分 2
帖子 3
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2005-4-8
 
发表于 2005-4-8 10:00  资料  个人空间  短消息  加为好友 
QUOTE(zhubob @ 2005-03-20 19:13:08)
将该结构变成asn1的描述结构,已经搞会了,将asn1的结构映射成c/c++的代码,在熟悉了asn1语言规范的情况下我想也不是难事,我现在困惑的是如何如何将asn1的描述结构变成一个数字码的数据流(因为无论是图象、语音、还是其它类型的用asn1描述的信息,最终进行传输的数字码数据)来进行传输,我利用cstabrower工具虽然找到了点点的规律但总体还是不知其原,这方面的资料又少的可怜,啃e文这两天啃的头的发晕,):
[right][snapback]443113[/snapback][/right]


zhubob兄,我也正想做一个ASN1的编译器,而且也是从头学起,看了你写的贴子,还是蛮受启发的.如何将ASN1的描述结构变成数字码流,我是这样理解的,不知对不对,共同探讨下:
ASN1描述文件经过编译器,要翻译成两个文件:一个是将数据类型映射成对应的C/C++的数据结构,主要是语言规则的映射,这个文件可以作头文件(.H).另一个是每种数据类型的编解码函数库(.C),比如某一个数据类型,其中包括很多项,有整型,布尔型等等,还可能是嵌套的,那么对这个数据类型要有一个编解码函数,将其中的嵌套结构拆开(或者也做成嵌套结构的可能更好),直至拆成各个简单类型的调用.对各个简单类型,可以单独做一个编解码实时库来实现编解码,即按编码规则编制成bit流,这个就比较简单了.这个实时库对任何ASN1文件的编译都是通用的,而上面编译生成的(.H)和(.C)只是一个特定的ASN1文件生成的.

顶部
djh0410cq
LU新生
Rank: 1



UID 30900
精华 0
积分 2
帖子 3
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2005-4-8
 
发表于 2005-4-8 10:01  资料  个人空间  短消息  加为好友 
QUOTE(zhubob @ 2005-03-20 19:13:08)
将该结构变成asn1的描述结构,已经搞会了,将asn1的结构映射成c/c++的代码,在熟悉了asn1语言规范的情况下我想也不是难事,我现在困惑的是如何如何将asn1的描述结构变成一个数字码的数据流(因为无论是图象、语音、还是其它类型的用asn1描述的信息,最终进行传输的数字码数据)来进行传输,我利用cstabrower工具虽然找到了点点的规律但总体还是不知其原,这方面的资料又少的可怜,啃e文这两天啃的头的发晕,):
[right][snapback]443113[/snapback][/right]


zhubob兄,我也正想做一个ASN1的编译器,而且也是从头学起,看了你写的贴子,还是蛮受启发的.如何将ASN1的描述结构变成数字码流,我是这样理解的,不知对不对,共同探讨下:
ASN1描述文件经过编译器,要翻译成两个文件:一个是将数据类型映射成对应的C/C++的数据结构,主要是语言规则的映射,这个文件可以作头文件(.H).另一个是每种数据类型的编解码函数库(.C),比如某一个数据类型,其中包括很多项,有整型,布尔型等等,还可能是嵌套的,那么对这个数据类型要有一个编解码函数,将其中的嵌套结构拆开(或者也做成嵌套结构的可能更好),直至拆成各个简单类型的调用.对各个简单类型,可以单独做一个编解码实时库来实现编解码,即按编码规则编制成bit流,这个就比较简单了.这个实时库对任何ASN1文件的编译都是通用的,而上面编译生成的(.H)和(.C)只是一个特定的ASN1文件生成的.

顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-4-8 12:09  资料  个人空间  主页 短消息  加为好友 
偶觉得编码函数可能是直接使用sprintf生成对应的格式的 应该不复杂

编码函数的话asn编译器会根据指定的内容生成一个.c与.h文件





不要问我结果 我只研究过程与思路
无双客栈
顶部
 



当前时区 GMT+8, 现在时间是 2008-9-8 17:13
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.058638 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver