当前位置: 首页 > ops >正文

SNMP中BER编码解析

在这里插入图片描述

字符占用字节数解析

1. 英文字符
  • ASCII 编码:1字节 (8比特)
    • 示例:'A' → 二进制 01000001
  • UTF-8 编码:1字节 (8比特)
    • 兼容 ASCII 的英文字符仍占1字节
2. 中文字符
编码类型字节数比特数示例
GBK/GB23122字节16比特'中'0xD6 0xD0
UTF-83字节24比特'中'0xE4 0xB8 0xAD
UTF-162字节16比特'中'0x4E 0x2D

特殊说明:少数生僻汉字在 UTF-8 中占4字节(如 𠀀0xF0 0xA0 0x80 0x80


BER 编码解析

原始数据
[0x06, 0x08, 0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00]
对应 OID 1.3.6.1.2.1.1.1.0

BER 解码步骤
BER编码
分解TLV结构
类型Tag
长度Length
值Value
1. 分解 TLV 结构
部分字节含义
Tag0x06对象类型:OBJECT IDENTIFIER
Length0x08值域长度:8字节
Value0x2B 0x06 0x01 0x02 0x01 0x01 0x01 0x00OID 编码值
2. OID 值域解码
# OID 编码规则:
# 第一段 = (X * 40) + Y
# 后续段:Base128 变长编码(最高位1表示继续)value = [0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00]# 步骤1:解码前两个数字
first_byte = 0x2B  # 43
x = first_byte // 40  # 43 ÷ 40 = 1
y = first_byte % 40   # 43 % 40 = 3
→ 得到 1.3# 步骤2:直接解码单字节数字
0x066
0x011
0x022
0x011
0x011
0x011
0x000# 最终OID:1.3.6.1.2.1.1.1.0
3. 完整解码过程
字节二进制解码规则结果数字
0x2B00101011(X*40)+YX=1, Y=31.3
0x0600000110直接取值6
0x0100000001直接取值1
0x0200000010直接取值2
0x0100000001直接取值1
0x0100000001直接取值1
0x0100000001直接取值1
0x0000000000直接取值0

最终 OID1.3.6.1.2.1.1.1.0


为什么这样设计?

1. 编码优化目标
  • 最小化空间:使用变长编码压缩大数字
  • 快速解码:单字节直接取值无需计算
  • 兼容性:支持无限长的 OID
2. 特殊规则说明
  • 前两段合并:因 OID 前两段范围有限(0≤X≤2, 0≤Y≤39),可用1字节表示:

    取值范围 = 0 到 (2*40 + 39) = 119
    实际最大值:X=2时,Y无上限(但标准定义Y<40)
    
  • 大数字处理(本例未涉及):

    # 示例:数字 30000 的编码
    30000 的二进制: 1 1101010 0110000
    分组(7位一组): [1, 1101010, 0110000]
    添加最高位: 0b111010100xEA (最高位1,表示继续)0b001100000x30 (最高位0,结束)
    最终编码: [0xEA, 0x30]
    

编码验证工具

使用 Python 验证编码:

from pyasn1.type import univ
from pyasn1.codec.ber import encoder# 定义 OID 对象
oid = univ.ObjectIdentifier('1.3.6.1.2.1.1.1.0')# BER 编码
ber_encoded = encoder.encode(oid)
print(list(ber_encoded)) 
# 输出: [6, 8, 43, 6, 1, 2, 1, 1, 1, 0] (即十六进制 06 08 2B 06 01 02 01 01 01 00)

总结

  1. 字符占用

    • 英文:1字节(ASCII/UTF-8)
    • 中文:2字节(GBK)或 3字节(UTF-8)
  2. OID BER 编码

    • TLV 结构:Type(1B) + Length(1B) + Value(NB)
    • 值域规则
      • 前两段合并为 40*X + Y
      • 后续段直接单字节取值(值<128时)
      • 大数字使用 Base128 变长编码(最高位为延续标志)
  3. 示例解码

    [0x06, 0x08, 0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00]
    → Tag=OID, Length=8, Value=1.3.6.1.2.1.1.1.0
    
http://www.xdnf.cn/news/14082.html

相关文章:

  • 微信小程序使用画布实现飘落泡泡功能
  • NLP学习路线图(四十八): NLTK
  • ​​实时人脸检测与人脸关键点识别系统实现
  • linux开机原理以及如何开关机-linux023
  • 同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——B
  • 深入剖析 Celery:分布式异步任务处理的利器
  • 项目会议过多如何优化沟通效率
  • [论文阅读] 人工智能 | Gen-n-Val:利用代理技术革新计算机视觉数据生成
  • uni-app项目实战笔记6--同一组件使用Props传递不同的值
  • springMVC-13 文件下载及上传
  • 英伟达诉求1亿IOPS SSD:打破AI算力存储瓶颈
  • 从技术视角解析星黎语音交互机器人的创新与行业影响
  • 分布式定时任务系列12:XXL-job的任务触发为什么是死循环?
  • IPv4详解
  • FWFW - Find Websites From World
  • Vue3中v-bind=“$attrs“用法讲解
  • el-table跨页多选和序号连续
  • Burn 开源程序是下一代深度学习框架,在灵活性、效率和可移植性方面毫不妥协
  • 使用Docker安装FFmpeg
  • 【Jmeter】Jmeter 高并发性能压力测试
  • 融智学教育观及其数学公式体系凝练汇总
  • 儿童智能玩具与传统玩具的区别
  • 倍思Nomos多合一桌面充:第六代氮化镓快充技术加持,性能全面提升
  • 【动手学深度学习】3.4. softmax回归
  • 鸿蒙开发-视频学习及实用中的一些小结
  • pytorch实战波斯顿房价回归模型
  • LINE 接入说明
  • 解决麒麟国产操作系统,分辨率下拉框是空白问题。
  • dsp28335
  • 洛谷自己创建的一个小比赛【c++】