做旅游的网站在哪里做,深圳网页设计培训要多久,个人淘宝客网站如何备案,怎么用网吧电脑做网站服务器本文将详细介绍ASN.1中的BER编码规则#xff0c;包括其编码机制、数据类型表示、以及如何将复杂的数据结构转换为二进制数据。通过本文的阅读#xff0c;读者将对ASN.1中的BER编码有一个全面的理解。 目录
一.引言
二.BER编码基本结构
▐ 1. 类型域#xff08;Type#… 本文将详细介绍ASN.1中的BER编码规则包括其编码机制、数据类型表示、以及如何将复杂的数据结构转换为二进制数据。通过本文的阅读读者将对ASN.1中的BER编码有一个全面的理解。 目录
一.引言
二.BER编码基本结构
▐ 1. 类型域Type
示例一
示例二
▐ 2. 长度域Length
示例一
示例二
▐ 3. 内容域Value
布尔型BOOLEAN
整型INTEGER
位串BIT STRING
字符串OCTET STRING
NULL
对象标识符OBJECT IDENTIFIER
序列SEQUENCE 一.引言
在现代通信和信息技术领域数据的精确表示和高效传输是至关重要的。ASN.1Abstract Syntax Notation One作为一种国际标准化组织ISO和国际电信联盟ITU制定的国际标准提供了一种抽象的方法来描述、编码、解码和传输数据。ASN.1的核心组成部分之一是BERBasic Encoding Rules它定义了一种将ASN.1数据结构转换为二进制形式的编码规则。
BER编码不仅确保了数据的一致性和互操作性而且通过其灵活的编码机制支持了广泛的数据类型和结构。从简单的整数和字符串到复杂的数据结构如序列和集合BER编码都能够提供一种标准化的表示方法。这使得不同系统和应用程序能够无缝地交换数据无论它们运行在何种平台或使用何种编程语言。 二.BER编码基本结构
BERBasic Encoding Rules是一种用于描述ASN.1Abstract Syntax Notation One数据的编码规则。BER编码广泛用于网络协议和数据交换标准例如SNMP和LDAP。BER编码使用一种TLVType-Length-Value的结构方法编码。
即BER编码的基本结构由以下三个部分组成
类型域Type长度域Length内容域Value 其中类型Type部分又有三部分组成
标签类型Class构造类型P/C标签号Tag 就拿C语言的数据结构来说除了有单一的Int类型Doubel类型等还有复杂的自定义类型结构体对于一种数据结构中包含了其他数据结构的情况BER编码也对其进行了规定称之为结构类型。结构类型与一般简单类型的不同如下图 如图所示在复杂的结构类型中他的内容域往往包含了许多简单类型。毕竟结构类型也只是简单类型的复合因此下午的讲解全部都通过简单类型进行讲解。
我们分别对三部分进行分析
▐ 1. 类型域Type
在 BERBasic Encoding Rules编码中类型域Type用于标识数据的类型和类别。类型域编码包含三个部分类Class、构造类型PC, Primitive/Constructed、和标签号Tag Number。下面详细说明这三个部分的编码
类型域结构
类型域是一个字节8 位或多个字节对于较大的标签号。第一个字节的结构如下 第1-2位类Class 00通用类Universal 01应用类Application 10上下文特定类Context-specific 11私有类Private 第3位构造类型Constructed/Primitive 0原始类型Primitive 1构造类型Constructed 第4-8位标签号Tag Number 若标签号小于 31即 0-30则直接使用这些位表示标签号。 若标签号大于等于 31则这些位全为 1并且标签号在后续字节中以一种特殊的方式编码。
笔者这里给出图示如下 对于标签号这里在解释一下 简单标签号0-30 对于标签号在 0 到 30 之间的情况直接在类型域的第4-8位表示。例如 通用类Universal布尔类型Boolean0000 0001即 0x01 应用类Application整数类型Integer0100 0010即 0x42 复杂标签号 31 对于标签号大于等于 31 的情况第4-8位全为 1即 0b11111并且标签号以基于 7 位的块形式在后续字节中表示每个字节的最高位为 1表示后续有更多字节最后一个字节的最高位为 0。例如 标签号 310b1111 1111 0011 1111即 0x1F 0x1F 标签号 1280b1111 1111 1000 0001 0000 0000即 0x1F 0x81 0x00 示例一
Tag number 31
yesterdayINTEGER ::127Class UniversalP/C Primitive(简单类型)Tag 2(INTEGER)Length 1 byteContent 127
按照给出的信息我们就可以得到如下结论
类型域值为:00000010(0x02)
长度域值为:01
内容域值为:7F
BER编码为:00000010 0000000101111111(02 01 7F)
示例二
Tag number 31
OwnInt ::[APPLICATION 33]IMPLICIT INTEGER
HillTall Ownint :: 110Class ApplicationP/C Primitive(简单类型)Tag 33Length 1Content 110
按照给出的信息我们就可以得到如下结论
类型值为:01011111 00100001(5F21)
长度值为:1
内容值为:6E(110)
BER编码为:5F 21 01 6E
总结 类型域的前两位表示类Class第三位表示构造类型Primitive/Constructed第四至第八位表示标签号Tag Number。 对于标签号小于 31 的情况直接使用第4-8位。 对于标签号大于等于 31 的情况使用多个字节表示第一字节的第4-8位全为 1后续字节以 7 位块形式表示标签号。
通过这种编码方式BER 能够灵活地表示各种数据类型并确保编码的准确性和可扩展性。
▐ 2. 长度域Length
在 BERBasic Encoding Rules编码中长度域用于指示随后的值域Value的长度。长度域的编码有主要两种形式短形式和长形式。下面是对这两种形式的详细说明
短形式
短形式用于表示长度小于 128 字节即 0 到 127的情况。在这种形式中长度域仅占一个字节。该字节的最高位第八位为 0低七位表示长度的值。例如 若长度为 5则长度域为 0000 0101即 0x05。 若长度为 127则长度域为 0111 1111即 0x7F。
长形式
长形式用于表示长度大于等于 128 字节的情况。在这种形式中长度域的第一个字节的最高位第八位为 1低七位表示后续长度字节的个数。例如 若长度为 128则长度域为 1000 0001表示后续有 1 个字节加上 1000 0000表示长度为 128即 0x81 0x80。 若长度为 300则长度域为 1000 0010表示后续有 2 个字节加上 0000 0001 0010 1100即 300即 0x82 0x01 0x2C。
长度不确定
上述俩种情况适合用于长度确定的情况当长度不确定的时候长度字节最高位置1该字节的低7位置0。紧随的字节为内容字节最后以两个字节 0x00 和 0x00 作为结束标志
图示如下 示例一
Length 128
DayOfYear :: [application 17]IMPLICIT INTEGER
Today DayOfYear ::128Class ApplicationP/C PrimitiveTag 17Length 2Content 128 按照给出的信息我们就可以得到如下结论
提示这里的内容域首位为 1 所有前面要加一个字节的0后文会讲这部分
类型值:01 0 10001
长度值:0000 0010
内容值:0x00 80
BER编码为:01010001 00000010 00000000 10000000
示例二
Length 128
MemoString :: Octest String( size(256))
memo MemoString ::“abc...Class UniversalP/C PrimitiveTag 4Length 256
按照给出的信息我们就可以得到如下结论
类型值:00 0 00100(04)
长度值:1000 0010(0x82) 0000 0001 0000 0000(0x0100)
内容值:61 62 63...(”abc...”)
BER编码为:04 82 01 00 61 62 63
总结 对于长度小于 128 的值使用短形式只需要一个字节最高位为 0。 对于长度大于等于 128 的值使用长形式首字节的最高位为 1低七位表示后续字节的数量这些后续字节组成一个大端整数表示长度值。 如果长度不确定长度字节最高位置1该字节的低7位置0最后以俩个字节 0x00 和 0x00 作为结束标志
这样BER 编码能够灵活地表示不同长度的数据确保编码的效率和可扩展性。
▐ 3. 内容域Value
在 BERBasic Encoding Rules编码中内容域Value包含实际的数据信息其编码方式取决于数据的类型。不同数据类型有不同的编码规则。以下是一些常见数据类型的编码方式
布尔型BOOLEAN
布尔型值使用一个字节表示 TRUE 编码为 0xFF FALSE 编码为 0x00
整型INTEGER
整型值以大端顺序高字节在前编码使用最少的字节数来表示值。如果最高有效位为 1则需要在前面加一个 0x00 以避免符号扩展。例如 0 编码为 0x00 127 编码为 0x7F 128 编码为 0x00 0x80 -1 编码为 0xFF
位串BIT STRING
位串由一个初始字节和实际数据组成。初始字节表示未使用的位数。实际数据按字节顺序排列。例如 0x01101011假设全用编码为 0x00 0x6B 0x01101010未使用1位编码为 0x01 0x6A
字符串OCTET STRING
字符串八位字节串按字节顺序直接编码。例如 Hello 编码为 0x48 0x65 0x6C 0x6C 0x6F
NULL
NULL 值没有内容其长度为 0。因此NULL 值的编码只是标记和长度值为空。例如 NULL 编码为 0x05 0x00
对象标识符OBJECT IDENTIFIER
对象标识符使用变量长度编码。前两个节点由 (X * 40) Y 公式表示后续节点使用基于 7 位的块形式编码最高位为 1 表示有后续字节。例如 1.2.840.113549 编码为 0x2A 0x86 0x48 0x86 F7 0x0D1*40 2 42, 840 0x86 0x48, 113549 0x86 0xF7 0x0D
序列SEQUENCE
序列包含一个或多个元素每个元素按其类型编码然后依次排列。例如一个包含一个整数和一个字符串的序列 整数42 编码为 0x02 0x01 0x2A 字符串Hi 编码为 0x04 0x02 0x48 0x69
整个序列编码为0x30标记 0x07长度 0x02 0x01 0x2A整数 0x04 0x02 0x48 0x69字符串
总结
值域的编码方式根据数据类型的不同而不同具体编码规则如下 布尔型使用一个字节表示 TRUE 或 FALSE。 整型大端顺序使用最少的字节数。 位串一个初始字节表示未使用的位数后跟实际数据。 八位字节串直接按字节顺序编码。 NULL无内容长度为 0。 对象标识符使用变量长度编码前两个节点压缩表示后续节点基于 7 位块编码。 序列包含一个或多个元素按其类型编码后依次排列。
通过这些编码规则BER 能够灵活且高效地表示各种类型的数据。 以上便是BER编码的基础结构和编码方法掌握了上述种种就可以构建基本的BER编码而更加复杂的编码也只是多个简单的编码复合而成。研究BER编码对于以下应用场景也有着重要的作用 网络协议BER编码在网络协议中用于确保数据在不同系统和平台之间传输时的准确性和完整性。 安全协议在安全领域BER编码用于加密和解密过程中确保数据的安全传输如在SSL/TLS协议中。 数字证书BER编码用于数字证书的编码这是公钥基础设施PKI的关键组成部分广泛应用于身份验证和数据加密。 数据库在数据库系统中BER编码用于存储和检索结构化数据提高数据的组织和访问效率。 数据存储BER编码在数据存储解决方案中用于优化数据的存储格式减少存储空间的使用。 图像和视频传输在多媒体领域BER编码可以用于图像和视频数据的高效传输和存储。 本次的分享就到此为止了希望我的分享能给您带来帮助创作不易也欢迎大家三连支持你们的点赞就是博主更新最大的动力如有不同意见欢迎评论区积极讨论交流让我们一起学习进步有相关问题也可以私信博主评论区和私信都会认真查看的我们下次再见