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

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
    

相关文章:

  • JavaScript性能优化实战指南:从理论到案例的全面解析
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,
  • CQF预备知识:Python相关库 -- 核密度估计 scipy.stats
  • 关于cv::solvePnP算法的理解
  • R语言文本探索与预处理:入门指南
  • iOS 审核 cocos 4.3a【苹果机审的“分层阈值”设计】
  • 【Tip】工具网站
  • Python爬虫-爬取票牛明星演唱会数据,进行数据分析
  • 精益数据分析(103/126):免费移动应用的下载量、成本优化与案例解析
  • C++11 的线程管理(`std::thread`)
  • Cesium快速入门到精通系列教程九:Cesium 中高效添加和管理图标/标记的标准方式​​
  • 【Linux】进程优先级和切换调度
  • android关于native中Thread类的使用
  • C++ 环境配置
  • Visual studio 中 使用QT插件 编辑UI文件打开 Qt Designer 报错 问题解决方案
  • 论文精读Lami-Detr:Open-Vocabulary Detection with Language Model Instruction
  • 【量化】策略交易之动量策略(Momentum)
  • YOLOv2 中非极大值抑制(NMS)机制详解与实现
  • n8n 从 Docker 到 Node.js 本地环境迁移指南
  • Qt .pro配置gcc相关命令(三):-W1、-L、-rpath和-rpath-link
  • 网站建设中 什么意思/seo专员是干什么的
  • 淘宝联盟返利网站怎么做/免费p站推广网站入口
  • 公司找人做网站/竞价网络推广培训
  • 网站留言板html模板/百度指数排行榜
  • 网页设计图片怎么换/站长seo
  • 金银饰品那家网站做的好/注册网站免费注册