UPER编码中无边界字符串长度超127时的编码规则疑问
关于UPER编码中UTF8String长度用15位而非16位的原因
给定的ASN.1 Schema里,message字段是无约束的UTF8String(未指定SIZE范围),按照UPER(非对齐打包编码规则)的规范,这类字符串的长度编码遵循可变长度的高效编码逻辑,具体原因如下:
分层编码规则:
UPER针对字符串长度设计了分层编码方案,以最小化编码开销:- 当长度小于128(2^7)时,用7位存储长度,最高位设为0(短形式);
- 当长度在128~32767(2^15-1)区间时,采用「1位标志位 + 15位长度值」的组合:标志位设为1,后续15位直接存储长度的二进制值。
示例匹配逻辑:
示例中字符串长度为280,二进制是100011000(共9位),正好落在128~32767的区间内。编码后的首16位1000 0001 0001 1000拆解后:- 第一位
1是标志位,说明后续15位为长度值; - 剩余15位
000000100011000的十进制值就是280,完全覆盖所需长度信息。
- 第一位
为何不用16位:
15位的最大可表示值是32767,足够覆盖280的长度需求。UPER的核心设计原则是用最少的位传递有效信息,用1位标志位+15位长度值的方式,既满足了长度范围要求,又避免了16位编码带来的冗余位开销。
内容的提问来源于stack exchange,提问作者Yash Bhutada
相关产品推荐
相关产品推荐

