ASN.1语言详解(编码规则、关键字、符号、数据类型)

目录

 一. ASN.1基本信息

▐ ASN.1编码规则

二. ASN.1语法规范

▐ ASN.1的关键字

▐ ASN.1的符号

▐ ASN.1的数据类型

▐ 示例


一. ASN.1基本信息

ASN.1(Abstract Syntax Notation One)是一种国际标准(由ITU-T X.680系列建议定义),用于描述数据的结构。它主要用于定义和编码传输协议中的数据,以确保不同系统间的数据交换。

ASN.1语法可用来描述各种类型的数据,包括文本、图形、视频与音频等。通常用于定义应用数据的抽象语法和PDU的结构。比如SNMP中使用ASN.1进行管理信息结构SMI的定义和管理数据库MIB的定义。ASN.1编码可用来规范数据传输过程,解决异构网络对数据理解的二义性。

ASN.1最初是ITU针对电信协议设计而制定,后来被ISO接受成为国际标准。

ASN.1的主要应用:

  • 网络协议:ASN.1被广泛用于各种网络协议,如SNMP(Simple Network Management Protocol)、LDAP(Lightweight Directory Access Protocol)和X.500目录服务。它帮助定义和编码数据,使不同的系统可以互相通信。

  • 电信系统:在电信行业,ASN.1用于信令协议,如SS7(Signaling System No. 7)和GSM(Global System for Mobile Communications)。它确保不同电信设备之间的互操作性。

  • 安全协议:ASN.1被用于许多安全协议,如X.509数字证书和SSL/TLS。它帮助定义和编码证书、密钥和其他安全相关的数据结构。

  • 金融系统:在金融行业,ASN.1用于标准化各种交易和信息交换协议,如ISO 20022标准。这有助于不同金融机构之间的信息交换和处理。

  • 多媒体通信:ASN.1还用于多媒体通信协议,如H.323和H.264,用于视频会议、VoIP和其他实时通信应用。

  • 智能卡:在智能卡应用中,ASN.1用于定义和传输数据,如在电子护照和支付卡中。

  • 数据交换格式:ASN.1可用于定义通用数据交换格式,使不同系统能够理解和处理相同的数据结构。

▐ ASN.1编码规则

ASN.1的广泛应用得益于其灵活性和扩展性,以及它支持多种编码规则,如BER(Basic Encoding Rules)、DER(Distinguished Encoding Rules)和PER(Packed Encoding Rules),以满足不同应用的需求。ASN.1 提供了多种编码规范,以适应不同应用的需求。主要的编码规范包括:

  1. BER(Basic Encoding Rules)

    • 基本编码规则,是ASN.1的最基本编码规则,灵活且容易实现。
    • 使用标签类型(Type)、长度(length)和内容(value)三部分来表示数据。
    • BER的灵活性也意味着它可能会生成冗长的编码,不适合对效率要求高的场合。
  2. DER(Distinguished Encoding Rules)

    • 区别编码规则,是BER的子集,消除了BER中的不确定性,确保了唯一的编码方式。
    • 用于需要唯一编码的场合,如数字证书(X.509)和加密协议。
  3. CER(Canonical Encoding Rules)

    • 规范编码规则,与DER类似,但用于无限长字符串的情况下。
    • 通过规范化处理,确保编码的唯一性,适用于一些需要数据一致性的应用。
  4. PER(Packed Encoding Rules)

    • 紧凑编码规则,通过优化编码来减少数据的长度,适合对带宽敏感的场合。
    • 有两种变体:对齐(Aligned PER)和非对齐(Unaligned PER),对齐的编码会以八位字节为单位,而非对齐则不会。
  5. XER(XML Encoding Rules)

    • XML编码规则,将ASN.1描述的数据结构编码为XML格式,便于与基于XML的系统进行互操作。
    • 易于阅读和调试,但比其他编码规则更加冗长。
  6. OER(Octet Encoding Rules)

    • 八位字节编码规则,旨在提供一种高效且容易解析的编码规则。
    • 适用于需要紧凑和快速解析的应用场合。
  7. JER(JSON Encoding Rules)

    • JSON编码规则,将ASN.1描述的数据结构编码为JSON格式。
    • 适用于与基于JSON的系统和应用进行互操作。

这里对于BER编码的具体讲解可以查看:图文解析ASN.1中BER编码:结构类型、编码方法、编码实例


二. ASN.1语法规范

ASN.1(Abstract Syntax Notation One)的语法规范定义了一种描述数据结构的方式,其语法类似于编程语言中的声明和定义。

文字约定:

  • 区分大小写
  • 跳空格
  • 注释以--开头,以--结束或行尾结束
  • 标识符由大小写字母,数字和横线组成
  • 内部标识符(关键字)全部大写
  • 用户定义的类型名和模块名以大写字母开头
  • 宏名称全部大写
  • 变量名(数据对象)以小写字母开头

▐ ASN.1的关键字

以下是ASN.1关键字及其含义的表格:

关键字含义
INTEGER表示整型数据。
BOOLEAN表示布尔型数据,其值可以是TRUE或FALSE。
BIT STRING表示位串,由一系列的位组成。
OCTET STRING表示字节串,由一系列的字节组成。
NULL表示空值。
OBJECT IDENTIFIER表示对象标识符,用于唯一标识一个对象。
SEQUENCE表示序列类型,可以包含多个字段,字段可以是任意ASN.1类型。
SET类似于序列,但是元素的顺序不重要。
CHOICE表示选择类型,只能选择其中一个选项。
ANY表示任意类型。
ENUMERATED表示枚举类型,其值是预先定义的一组常量。
SEQUENCE OF表示序列类型,包含多个相同类型的元素。
SET OF类似于SEQUENCE OF,但是元素的顺序不重要。
OPTIONAL表示可选字段。
DEFAULT表示字段的默认值。
EXPLICIT表示显式标签。
IMPLICIT表示隐式标签。
TAGS用于定义数据类型的标签。
DEFINITIONS开始定义数据结构的关键字。
END结束定义的关键字。

这个表格提供了ASN.1中常用关键字的基本概述,帮助理解和使用ASN.1进行数据结构的定

▐ ASN.1的符号

以下是ASN.1中一些常用符号及其含义的表格:

符号含义
{}定义一个模块或类型的定义块
::=用于定义类型或值的赋值操作符
``
( )用于定义SEQUENCE或SEQUENCE OF中的字段
[ ]用于定义OPTIONAL或DEFAULT字段的标签
< >用于定义ANY类型时指定具体的类型
...表示省略号,用于省略重复的模式或序列
;用于分隔多个定义或语句
" "用于字符串字面量中的空格
' '用于枚举值中的分隔符
%x用于定义OCTET STRING类型中的十六进制值
%d用于定义INTEGER类型中的十进制值
%o用于定义INTEGER类型中的八进制值
%b用于定义BIT STRING类型中的二进制值

这些符号在ASN.1的语法中扮演着重要的角色,它们帮助定义数据结构和数据类型,以及如何组织和解释数据。

▐ ASN.1的数据类型

ASN.1提供了丰富的数据类型,用于定义网络协议和数据交换格式,这些部分内容在上述的关键字中也有提到。

简单类型:直接规定取值集合的类型

  • INTEGER:表示整数值。
  • BOOLEAN:表示布尔值(TRUE或FALSE)。
  • BIT STRING:表示位的序列。
  • OCTET STRING:表示字节序列。
  • NULL:表示空值。
  • OBJECT IDENTIFIER:表示对象标识符,用于唯一标识一个对象或类型。
  • ENUMERATED:表示从一组预定义的枚举值中选择。

结构类型:也叫构造类型,由多个组件构成的类型,每个组件是一个简单类型或者结构类型

  • SEQUENCE:序列类型,包含有序的字段集合。
  • SET:集合类型,包含无序的字段集合。
  • SEQUENCE OF:表示相同类型的元素序列。
  • SET OF:表示相同类型的元素集合
  • CHOICE:表示从多个选项中选择一个。
  • ANY:表示任意ASN.1类型。

标签类型

▐ 示例

以下是一些ASN.1语法的示例,展示了基本数据类型和构造类型的使用:

简单类型定义

PersonName ::= OCTET STRING
Age ::= INTEGER

复杂类型定义

Person ::= SEQUENCE {
    name    PersonName,
    age     Age,
    gender  ENUMERATED { male(0), female(1) },
    address OCTET STRING OPTIONAL
}

CHOICE类型

ContactInfo ::= CHOICE {
    phoneNumber OCTET STRING,
    emailAddress OCTET STRING
}

SEQUENCE OF类型

PhoneNumbers ::= SEQUENCE OF OCTET STRING

约束:ASN.1允许对类型进行约束,例如限制整数的取值范围:

Age ::= INTEGER (0..120)

下面是一个包含所有上述元素的完整ASN.1定义示例:

Person ::= SEQUENCE {
    name    OCTET STRING,
    age     INTEGER (0..120),
    gender  ENUMERATED { male(0), female(1) },
    contactInfo CHOICE {
        phoneNumber OCTET STRING,
        emailAddress OCTET STRING
    },
    addresses SEQUENCE OF OCTET STRING OPTIONAL
}

Company ::= SEQUENCE {
    companyName OCTET STRING,
    employees   SEQUENCE OF Person
}
  • Person类型定义了一个人,包括姓名、年龄、性别、联系信息和可选的地址列表。
  • Company类型定义了一个公司,包括公司名称和员工列表,每个员工都是一个Person类型。



 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义注解获取属性对应枚举的翻译值

平时在开发的时候难免会遇到枚举来翻译类&#xff0c;于是写一个自定义注解来在开发的时候自动翻译枚举的值 相关代码如下&#xff1a; Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) Documented JacksonAnnotationsInside public interface EnumShow {/*** …

农场app开发,在“小小”的土地上开出“大大”的花

随着经济与科技的不断发展&#xff0c;人们对所供应的健康食品&#xff0c;提出了新的需求。即人们希望可以查到其产地、种植方式、采摘时间、有机、无机等多个层面。农场app的开发&#xff0c;致力于帮助人们满足这一具体化需求。 一&#xff0e; 农场app开发的底层逻辑 农场…

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…

SpringBoot修改banner

在resources目录下创建banner.txt文件 到该网站下选择banner https://www.bootschool.net/ascii-art 点击拷贝&#xff1a; 粘贴到banner.txt中&#xff0c;保存 重新运行项目即可&#xff1a;

Spring Boot集成websocket实现webrtc功能

1.什么是webrtc&#xff1f; WebRTC 是 Web 实时通信&#xff08;Real-Time Communication&#xff09;的缩写&#xff0c;它既是 API 也是协议。WebRTC 协议是两个 WebRTC Agent 协商双向安全实时通信的一组规则。开发人员可以通过 WebRTC API 使用 WebRTC 协议。目前 WebRTC…

游戏运营与发行:从入门到实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

Java内存模型(JMM)详解

文章目录 1、Java内存模型2、JMM的核心概念1&#xff09;主内存与工作内存2&#xff09;内存可见性3&#xff09;JMM的三大特性&#xff1a;原子性、可见性、有序性。 3、JMM中的八种操作4、Happens-before 规则5、样例&#xff1a; 1、Java内存模型 Java内存模型&#xff08;…

Redis常见数据类型及其常用命令详解

文章目录 一、Redis概述二、Redis常用命令1.通用命令1.1 KEYS&#xff1a;查看符合模板的所有 key1.2 DEL&#xff1a;删除一个指定的 key1.3 EXISTS&#xff1a;判断 key 是否存在1.4 EXPIRE&#xff1a;给一个 key 设置有效期&#xff0c;有效期到期时该 key 会被自动删除1.5…

gridview自带编辑功能如何判断用户修改的值的合法性

在使用GridView的编辑功能更新值时&#xff0c;确保输入的值合法性是十分重要的。为了实现这一点&#xff0c;你可以在GridView的RowUpdating事件中加入代码来检查用户输入的值。如果发现输入的值不合法&#xff0c;你可以取消更新操作并向用户显示错误消息。下面是如何实现的步…

区区微服务,何足挂齿?

背景 睿哥前天吩咐我去了解一下微服务&#xff0c;我本来想周末看的&#xff0c;结果周末没带电脑&#xff0c;所以只能周一看了。刚刚我就去慕课网看了相关的视频&#xff0c;然后写一篇文章总结一下。这篇文章算是基础理论版&#xff0c;等我之后进行更多的实践&#xff0c;…

Matlab初识:什么是Matlab?它的历史、发展和应用领域

目录 一、什么是Matlab&#xff1f; 二、Matlab的历史与发展 三、Matlab的应用领域 四、安装和启动Matlab 五、界面介绍 六、第一个Matlab程序 七、总结 一、什么是Matlab&#xff1f; Matlab 是由 MathWorks 公司开发的一款用于数值计算、可视化以及编程的高级技术计算…

vue中axios从content-disposition响应头获取中文名

在Vue中使用axios请求文件时&#xff0c;服务器可能会返回带有Content-Disposition响应头的文件&#xff0c;其中可能包含文件名的编码信息。如果你需要解码这个文件名&#xff0c;可以使用JavaScript的内置URL API来处理。 Java中用于设置HTTP响应头的&#xff0c;通常在Web开…

HTML5新标签

HTML5 特点 新标签 <header>...<header> 头部标签 <footer>...<footer> 尾部标签 <section>...<section> 内容区块 <article>...&#xff0c;article> 表示页面中的独立内容 <aside>...<aside> 标签定义其所处…

JavaScript Window对象之(BOM、JS 执行机制、location对象、navigator对象、histroy对象、本地存储)

目录 1. BOM(浏览器对象模型)2. JS 执行机制3. location对象4. navigator对象5. histroy对象6. 本地存储6.1 localStorage6.2 sessionStorage 1. BOM(浏览器对象模型) BOM(Browser Object Model)是浏览器对象模型。其中window对象是JavaScript中一个全局的顶级对象基本的BOM属性…

定个小目标之刷LeetCode热题(23)

今天写这道题&#xff0c;背过八股文的都应该知道LRU算法缓存的基本原理&#xff0c;在 Java 语言中&#xff0c;同样有类似的数据结构 LinkedHashMap&#xff0c;本题我们采用自己创建哈希表双链表的形式简单实现一下 对于get操作&#xff1a;通过cache.get(key)获取&#xff…

【经典爬虫案例】用Python爬取微博热搜榜!

一、爬取目标 本次爬取的是: 微博热搜榜 &#xff08;代码也可直接在下方拿&#xff09;&#xff1a; ​ 分别爬取每条热搜的&#xff1a; 热搜标题、热搜排名、热搜类别、热度、链接地址。 下面&#xff0c;对页面进行分析。 经过分析&#xff0c;此页面没有XHR链接通过&am…

CSDN 自动上传图片并优化Markdown的图片显示

文章目录 完整代码一、上传资源二、替换 MD 中的引用文件为在线链接参考 完整代码 完整代码由两个文件组成&#xff0c;upload.py 和 main.py&#xff0c;放在同一目录下运行 main.py 就好&#xff01; # upload.py import requests class UploadPic: def __init__(self, c…

VBA学习(6): 调整工作表中所有图表尺寸并使其大小相同

有时候&#xff0c;我们想要将工作表中的所有图表进行缩放操作&#xff0c;且要求这些图表调整后的尺寸大小相同。如果使用手动拖放调整&#xff0c;看似大小相同&#xff0c;实际可能有差异。当然&#xff0c;也可以选取所有的图表后&#xff0c;在工作表选项卡中输入其宽度和…

TOP10!YashanDB斩获广东省优秀信创产品与解决方案双料荣誉

近日&#xff0c;2024广东软件风云榜结果出炉&#xff0c;表彰为广东软件产业和数字经济、新型工业化发展作出突出贡献的企业、企业家、优秀产品等。深算院崖山数据库系统 YashanDB荣获广东省“2024年优秀信息技术应用创新产品TOP10”和“2024年优秀信息技术应用创新行业应用解…

LeetCode 1789, 6, 138

目录 1789. 员工的直属部门题目链接表要求知识点思路代码 6. Z 字形变换题目链接标签思路代码 138. 随机链表的复制题目链接标签思路代码 1789. 员工的直属部门 题目链接 1789. 员工的直属部门 表 表Employee的字段为employee_id&#xff0c;department_id和primary_flag。…