BER编码规则

一、BER 编码规则介绍

BER (基本编码规则) 是 ASN.1 标准制定的用于将数据编码为二进制格式的原始规则。这些规则在 ASN.1 术语中统称为传输语法,指定用于编码数据的确切八位字节(8 位字节)。

二、BER编码数据组成

BER 基本编码规则的格式指定了一种用于编码 ASN.1 数据结构的自描述和自定界格式。每个数据元素都被编码为类型标识符长度描述实际数据元素,以及必要时的内容结束标记。这些类型的编码通常称为类型-长度-值(TLV) 编码。但是,在 BER 的术语中,它是identifier-length-contents。这种格式允许接收者从不完整的流中解码 ASN.1 信息,而无需预先了解数据的大小、内容或语义.

Identifier octets TypeLength octetsContents octetsEnd-of-Contents octets
TypeLengthValue(only if indefinite form)

三、Identifier octets Type

type 被编码成一个或多个字节,主要由 标签种类tag class,数据类型P(Primitive)/C(Constructed),tag number 组成。

结构如下:
在这里插入图片描述
第一个字节的前2位表示 tag class 第3位表示p/c,后边则是tag number

1. tag class 分类

tag class 有以下几种,它的值是用来区分 ASN.1 类型

类型说明
universal0表示原始的数据类型
application1只适用于一个特定的应用程序类型
context-specific3根据上下文定义的类型
private4私人规范中定义的类型

2. p/c 分类

p/c 表示数据内容是基本的数据类型还是复合的数据类型。

类型说明
Primitive §0数据内容仅由一个数据元素组成
Constructed ©1数据内容由多个数据元素组成

3 tag type

tag type 数据的标识,是固定的。在asn.1的原始数据类型表里可以看到。
如果定义的数据类型不是 Universal 的数据类型,那么此时需要用到更多的字节序列如 Octet2。在使用这类标记的时候,要将 Octet1 的第 5 到第 1 个二进制位置为 1 ,如果 Octet2 后面还有 Octet3,那么 Octet2 的第 8 个二进制位应该为 1。

4. ASN.1的原始数据类型(TAG)

数据类型编码类型Tag number(十进制)Tag number(十六进制)
End-of-Content (EOC)Primitive00
BOOLEANPrimitive11
INTEGERPrimitive22
BIT STRINGBoth33
OCTET STRINGBoth44
NULLPrimitive55
OBJECT IDENTIFIERPrimitive66
Object DescriptorBoth77
EXTERNALConstructed88
REAL (float)Primitive99
ENUMERATEDPrimitive10A
EMBEDDED PDVConstructed11B
UTF8StringBoth12C
RELATIVE-OIDPrimitive13D
TIMEPrimitive14E
Reserved15F
SEQUENCE and SEQUENCE OFConstructed1610
SET and SET OFConstructed1711
NumericStringBoth1812
PrintableStringBoth1913
T61StringBoth2014
VideotexStringBoth2115
IA5StringBoth2216
UTCTimeBoth2317
GeneralizedTimeBoth2418
GraphicStringBoth2519
VisibleStringBoth261A
GeneralStringBoth271B
UniversalStringBoth281C
CHARACTER STRINGConstructed291D
BMPStringBoth301E
DATEPrimitive311F
TIME-OF-DAYPrimitive3220
DATE-TIMEPrimitive3321
DURATIONPrimitive3422
OID-IRIPrimitive3523
RELATIVE-OID-IRIPrimitive3624

四、 Length octets

Length字段标识 value字段编码 的字节数,分为定长和不定长。其中定长的length指的是长度不超过 127 的短格式和长度超过 127 字节的长格式。
在这里插入图片描述

1、定长的短格式

a、前面的第一位是0,后边的7个位代表长度,因为7个位的2进制是0111 1111,最大也就是127,所以要求短格式不能超过127
b、定长长格式:最高位是1,后面的7个位表示长度值占用的字节数,然后跟上长度值。

例如长度为300,转换成2进制是0000 0001 0010 1100,占用2个字节,那么编码后应该是
1 000 0010 0000 0001 0010 1100 总共占用3个字节,用16进制表示 0x82 0x01 0x2c

2、不定长格式

根据图上看到最高位为1,后边7个位全是0,那就是1000 0000 也就是0x80 固定的数值
在value结尾处标记2个0x00代表内容结束,因为是不定长,必须知道内容在网络上传输时读到啥时候结束。

3、保留格式

最高位为1,后边7个为全是1,0xFF表示
同时在数据内容结尾处用2个0x00标记,代表着内容结束。

五、Contents octets

value 是数据内容的字节编码,如果不存在或者是虚对象的时候可能没有,比如value是NULL

六 、BER编码番外

  1. CER 和DER 都是BER的一种变体,他们从基本编码规则允许的编码中选择一种编码,消除了其余选项。
  2. X.690
    X.690 是一个ITU-T(https://en.wikipedia.org/wiki/ITU-T)标准,指定了几种编码规则,主要是(BER, CER, DER )
  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BER(Basic Encoding Rules,基本编码规则)是ASN.1(Abstract Syntax Notation One,抽象语法表示法一)编码规则中的一种,用于将数据转换为二进制编码,以便在网络上传输和存储。 以下是BER编码的详细规则和相关知识: 1. BER编码的数据类型: - 基本类型:布尔型、整数型、实数型、空类型和位字符串类型; - 结构类型:序列类型、集合类型和选择类型。 2. BER编码的数据格式: - 所有的数据类型都以标记(Tag)、长度(Length)和值(Value)的形式进行编码; - 标记用于标识编码的数据类型; - 长度用于表示值的长度; - 值是实际的数据。 3. 标记(Tag): - 标记的格式为一个或多个字节,第一个字节的最高位为0,表示该标记占用的字节数; - 第二个字节的最高位为1,表示该标记占用的字节数大于1个; - 标记的低7位用于标识数据类型。 4. 长度(Length): - 长度的格式也是一个或多个字节,第一个字节的最高位为0,表示该长度占用的字节数; - 如果第一个字节的最高位为1,则该字节的低7位表示后面的字节数; - 如果长度大于127个字节,则第一个字节的低7位表示长度占用的字节数,后面的字节表示实际的长度值。 5. 值(Value): - 值的格式与数据类型有关,可以是一个或多个字节。 6. BER编码的优点: - 可以处理各种数据类型,包括结构体和位字符串等; - 可以处理可选字段和默认值等情况; - 编码后的数据长度相对较小,传输效率高。 7. BER编码的缺点: - 编码和解码的复杂度较高; - 编码后的数据不易读懂,难以直接进行调试和诊断。 总之,BER编码是一种ASN.1编码规则,用于将数据转换为二进制编码以便在网络上传输和存储。虽然BER编码的复杂度较高,但其具有处理各种数据类型、处理可选字段和默认值、编码后的数据长度相对较小等优点,在一些领域应用广泛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸福在路上wellbeing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值