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
相关产品推荐
相关产品推荐

