You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QR码处理中ASN1解码重编码与base45原始数据存在差异如何修正

问题原因

你的代码核心问题是ASN1解码阶段只保留了字段值,完全丢弃了每个ASN1节点的标签(TAG)元数据,包括标签类型、所属类、标签号这些关键信息,重编码的时候只能用默认值硬编码,自然和原始编码结果不一致。

修复方案

1. 修改解码函数,保留每个节点的TAG信息

把原来只存值的逻辑改成存储(标签对象, 内容)的元组,构造类型的内容是嵌套的同结构列表:

def asn1decode(d: asn1.Decoder) -> List:
    res = []
    while not d.eof():
        tag = d.peek()
        if tag.typ == asn1.Types.Primitive:            
            tag, value = d.read()
            res.append((tag, value))
        elif tag.typ == asn1.Types.Constructed:            
            d.enter()
            res.append((tag, asn1decode(d)))
            d.leave()
    return res

2. 修改编码函数,使用原始TAG信息写入

不再硬编码构造类型的参数,而是用解码时保留的原始TAG参数来生成编码:

def asn1encode(d: asn1.Encoder, l: List) -> asn1.Encoder:
    for tag, content in l:
        if tag.typ == asn1.Types.Constructed:
            d.enter(tag.typ, tag.cls, tag.nr)
            asn1encode(d, content)
            d.leave()
        else:
            d.write(content, nr=tag.nr, cls=tag.cls, typ=tag.typ)
    return d

3. 原有调用逻辑无需修改

你原来的解码、编码调用代码可以保持不变,运行后即可得到和原始base45解码结果完全一致的重编码输出。

额外注意

你当前实现的base45decode_nl函数在处理带前导零的字节序列时会丢失前导零,如果你后续需要处理这类场景,需要额外适配base45的标准填充逻辑。

内容的提问来源于stack exchange,提问作者Buurman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:27:01