首頁  >  文章  >  後端開發  >  如何進行 asn1 marshal/unmarshal 並省略字段?

如何進行 asn1 marshal/unmarshal 並省略字段?

PHPz
PHPz轉載
2024-02-09 10:57:08472瀏覽

如何进行 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除