没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
PER
编码规则
一 名词解释
ASN.1:抽象标记语言
PER:压缩编码规则(Packed Encoding Rules), ASN.1 编码规则之一
Bit
:比特位
MIN:ASN.1 中规定为无穷小
MAX:ASN.1 中规定为无穷大
ub:约束上限
lb:约束下限
根列表:约束中第一个扩展标记前的初始约束
扩展列:扩展标记后面的扩展约束值
二
PER
编码规则
PER
编码有两个变体:对齐和非对齐方式,两者的编码过程基本相同,对齐方式下,如果前面的
信息经编码后得到的二进制比特流不是一个八位组的倍数,而后一个信息又是以八位组为单位进行编码
的,那就需要在在前面生成的比特流后面填充 0,使得长度变为八位组的倍数,所以一般补 0 的位数是
0-7bit;而非对齐方式则没有这种要求,所有信息按规则进行编码后得到的比特流数据,按顺序首尾连接,
中间不需要任何填充,编码结束后,最终得到的编码数据如果不是 8 的倍数,则需在后填 0 补全。
不对齐方式则编码更为紧凑,但是在编解码时需要花费更多的处理时间。
2.1 ASN.1 中的符号及定义
::= 定义为
| 或
-- 后面是注释(行)
{} 清单的开始和结束
[] 标签的开始和结束
() 子类型的开始和结束
.. 范围
... 扩展列
在 ASN.1 中,符号的定义没有先后次序:只要能够找到该符号的定义即可,ASN.1 的定义有类型
定义,值定义,信息对象类和信息对象定义,模块定义等。
类型定义:<新类型的名字>::= <类型描述>
其中:
新类型的名字是以大写字母开头,例如:
Msg ::= INTEGER
--定义 Msg 为 INTEGER 类型
--相当于 C 语言中 typedef INTEGER Msg,
值定义:<新的值的名字><该值的类型> ::= <值描述>
其中:
<新的值的名字>是以小写字母开头的标识符;
<该值的类型>可以是一个类型的名字,也可以是类型描述;
<值描述>是基于整数、字符串、标识符的组合。
例如:
msg Msg ::= 45 或者 msg Msg ::= {8,12,40}
--定义变量 msg 为 Msg 类型,其取值为 45 或者 8,12,40
模块定义:<模块名字> DEFINITIONS <缺省 Tag> ::= BEGIN
EXPORTS <导出描述> --声明类型,其他模块可以调用该类型
IMPORTS <导入描述> --声明类型,调用其他模块声明的类型
<模块体描述>
END
其中,模块名字是以大写字母开头,例如:
MsgTest DEFINITIONS AUTOMATIC TAGS ::= BEGIN
Msg1 ::= INTEGER(3..MAX),
Msg2 ::= ENUMERATED {red(3), blue, yellow, purple},
Msg3 ::= SEQUENCE{
time INTEGER,
pading INTEGER(1..3) OPTIONAL,
ret BOOLEAN
}
END
AUTOMATIC TAGS 是指缺省 Tag,说明不关注模块的 Tag。
2.2 编码规则
分组编码规则包括三个部分: preamble (前缀)、 length (长度)、 contents (内容)。
其编码格式如表 1 所示:
表 1 PER 编码组成
Preamble length Content
(1)preamble :
它一般只出现在 ENUMERATED 、 SEQUENCE 、 SET、 CHOICE 四种数据结构的编码中。
用来记录结构中有无扩展项(extension)、选择项(optional)或缺省项(default)。
(
2
)
length
:
对 STRING、 SEQUENCE OF 、 SET OF 等数据类型进行编码时,需对其长度按对齐方式进
行编码。
(3)contents :
若数据是基本结构类型,如: BOOLEAN 、 INTERGER、 REAL、 BITSTRING 等,即可直
接进行编码; 若数据是复合结构类型, 如 SEQUENCE 、 SET、 CHOICE、 SEQUENCE OF 等,
则属嵌套编码,此时
contents
中也包含有
preamble
、
length
、
contents
三个部分(注:在以下举
例中,为对齐需要插入 0 的地方,以 (pad) 表示)。
2.3 ASN 基本类型
A SN 基本类型如下图 1 所示:
图 1 基本类型
2.4 PER 可见子类型约束
为了最大限度的压缩编码,PER 需要依赖 ASN.1 描述中的子类型约束。约束增加的越具体,PER
越能得到更优化的编码(压缩越多)。而且 PER 会使用到的约束都是经常使用的约束,这样也使得 PER
编译器容易实现。此外,这些约束都是编译器在编译过程中“静态”使用的,不会增加实际编解码过程
处理时间。
这类约束被称为 PER 可见约束(PER-Visible Constraints),如图 2 所示:
图 2 PER 可视约束
三 整型编码(INTEGER)
整型的 PER 编码主要分为全约束、半约束、无约束三种方式进行编码,其中全约束和半约束是按
照非负二进制整数的编码方式编码,无约束是按照 2 的补码二进制整数的编码方式编码;在 2 的补码二
进制整数的编码中,由于存在负数的编码表示,为保证编码的唯一性,因此在 ASN.1 中规定,整个数的
编码应具有八位整数倍的字段宽度,且满足该字段引导的
9
个位不全为
1
,也不全为
0
;(主要表达为内
容八位组编码的最高位为符号位,如果正数的内容八位组最高位(bit8)为 1 时,应该在前端填充一个
00 字节的八位组,如果负数的最高位(bit8)是 0 时,应在前端填充一个 FF 字节的八位组。)
3.1 无约束整型编码
无约束整型编码主要由取值的编码和长度
L
的编码两部分组成,其中无约束主要表现有两种:
剩余21页未读,继续阅读
资源评论
- 无能为力就要努力2023-07-28这份文件提供了一个简洁明了的概述,对于初学者而言是一个很好的起点。
- 经年哲思2023-07-28该文件对于asn.1抽象标记语言的per和oer编码规则进行了简洁准确的概述,使得读者能够快速掌握相关知识。
- 卡哥Carlos2023-07-28这份文件对于asn.1抽象标记语言的per和oer编码规则进行了简明扼要的总结,非常实用。
- 阿汝娜老师2023-07-28作者在这份文件中使用了清晰的语言,避免了术语繁杂,使得这个主题更容易理解。
- 普通网友2023-07-28这篇文件以简单直接的方式介绍了asn.1抽象标记语言的per和oer编码规则,让读者可以轻松理解。
ForG·soul
- 粉丝: 14
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功