登录
首页 >  Golang >  Go问答

简化 ASN1 Marshal/Unmarshal 过程以跳过字段

来源:stackoverflow

时间:2024-02-07 22:18:19 137浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《简化 ASN1 Marshal/Unmarshal 过程以跳过字段》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

type bearer struct {
    CreatedAt time.Time     `asn1:"generalized"`
    ExpiresAt time.Time     `asn1:"generalized"`
    Nonce     string
    Signature []byte        `asn1:"-"`
    TTL       time.Duration `asn1:"-"`
    Frequency int           `asn1:"-"`
}

c := &bearer{
  CreatedAt: time.Now()
  ExpiresAt: time.Now().Add(1*time.Minute())
  Nonce: "123456789abcdefghijklmnop"
  Frequency: 1
}

b, err := asn1.Marshal(*c)
os.WriteFile("b64.txt", b, 0777)

将成功编组该结构,但是,当使用 Bash 检查该结构时 base64 -d b64.txt > b64.txt.der 我仍然可以看到 asn1:"-" 字段实际上已编组并写入文件,并且没有值的字段得到 Error: 对象长度为零.。为什么 asn1:"-" 不像 json 那样工作?


正确答案


因为 encoding/json 包是为了支持 - 选项而实现的,而encoding/asn1 不是。至于为什么,这里不是地方。接受 encoding/asn1 的主要目标是支持读写 X.509 证书,这并不意味着成为 ASN1 实现的“瑞士军刀”。

如果要排除某些字段,请创建排除这些字段的结构类型。为了避免重复,您可以将这些“剥离”的结构嵌入到您自己的结构中,其中包括附加字段,例如:

type bearerAsn1 struct {
    CreatedAt time.Time `asn1:"generalized"`
    ExpiresAt time.Time `asn1:"generalized"`
    Nonce     string
}

type bearer struct {
    bearerAsn1
    Signature []byte
    TTL       time.Duration
    Frequency int
}

仅marshal/unmarshal bearer.bearerAsn1,所以bearer的其他字段自然会被排除。

今天关于《简化 ASN1 Marshal/Unmarshal 过程以跳过字段》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>