ホームページ  >  記事  >  バックエンド開発  >  asn1 のマーシャル/アンマーシャルを実行し、フィールドを省略するにはどうすればよいですか?

asn1 のマーシャル/アンマーシャルを実行し、フィールドを省略するにはどうすればよいですか?

PHPz
PHPz転載
2024-02-09 10:57:08470ブラウズ

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

php エディター Apple は、asn1 マーシャル/アンマーシャルを実行し、フィールドを省略する方法を紹介します。 asn1 エンコードを扱う場合、多くの場合、データをエンコード (マーシャル) またはデコード (アンマーシャル) する必要がありますが、構造全体を解析せずに一部のフィールドのみを考慮する場合があります。この目標を達成するには、いくつかのテクニックを使用して不要なフィールドを省略し、それによって処理効率を向上させることができます。次に、これを実現する方法について詳しく説明します。

質問内容

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:"-" フィールドは実際にはマーシャリングされてファイルに書き込まれ、値のないフィールドは エラー: オブジェクトの長さはゼロです。 を取得します。 asn1:"-"json のように機能しないのはなぜですか?

解決策

encoding/json パッケージは、- オプションと # をサポートするために実装されているためです。 ##encoding/asn1 いいえ。なぜかというと、ここはそんな場所ではないんです。 encoding/asn1 を受け入れる主な目的は、X.509 証明書の読み書きをサポートすることであり、ASN1 実装の「スイス アーミー ナイフ」を意図したものではありません。

特定のフィールドを除外する場合は、それらのフィールドを除外する構造タイプを作成します。重複を避けるために、これらの「取り除かれた」構造を、追加のフィールドを含む独自の構造に埋め込むことができます。例:

リーリー

bearer.bearerAsn1

のみがマーシャル/アンマーシャルされるため、bearer の他のフィールドは当然除外されます。

以上がasn1 のマーシャル/アンマーシャルを実行し、フィールドを省略するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。