首页 > 后端开发 > Golang > 正文

如何进行 asn1 marshal/unmarshal 并省略字段?

PHPz
发布: 2024-02-09 10:57:08
转载
556人浏览过

如何进行 asn1 marshal/unmarshal 并省略字段?

php小编苹果为您介绍如何进行asn1 marshal/unmarshal并省略字段的方法。在处理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 并省略字段?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号