Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melakukan asn1 marshal/unmarshal dan omit fields?

Bagaimana untuk melakukan asn1 marshal/unmarshal dan omit fields?

PHPz
PHPzke hadapan
2024-02-09 10:57:08471semak imbas

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

PHP Editor Apple akan memperkenalkan anda cara melaksanakan asn1 marshal/unmarshal dan abaikan medan. Apabila berurusan dengan pengekodan asn1, kita selalunya perlu mengekod (marshal) atau menyahkod (unmarshal) data, tetapi kadangkala kita hanya mengambil berat tentang beberapa medan tanpa menghuraikan keseluruhan struktur. Untuk mencapai matlamat ini, kami boleh menggunakan beberapa teknik untuk mengetepikan medan yang tidak perlu, dengan itu meningkatkan kecekapan pemprosesan. Seterusnya, kami akan terperinci bagaimana untuk mencapai ini.

Isi soalan

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)

Struktur akan berjaya disusun, bagaimanapun, apabila memeriksa struktur menggunakan Bash base64 -d b64.txt > b64.txt.der Saya masih melihat asn1:"-" medan sebenarnya disusun dan ditulis pada fail, dan medan tanpa nilai mendapat <code>Ralat: Panjang objek adalah sifar.. Mengapa asn1:"-" tidak berfungsi seperti json? base64 -d b64.txt > b64.txt.der 我仍然可以看到 asn1:"-" 字段实际上已编组并写入文件,并且没有值的字段得到 Error: 对象长度为零.。为什么 asn1:"-" 不像 json 那样工作?

解决方法

因为 encoding/json 包是为了支持 - 选项而实现的,而encoding/asn1 不是。至于为什么,这里不是地方。接受 encoding/asn1

Penyelesaian

Sebab pakej pengekodan/json adalah untuk Dilaksanakan untuk menyokong pilihan - dan encoding/asn1 Tidak. Kenapa, ini bukan tempatnya. Matlamat utama menerima encoding/asn1 adalah untuk menyokong membaca dan menulis sijil X.509, ia tidak dimaksudkan untuk menjadi "Pisau Tentera Swiss" pelaksanaan ASN1.

bearer.bearerAsn1,所以bearerJika anda ingin mengecualikan medan tertentu, buat jenis struct yang mengecualikan medan ini. Untuk mengelakkan pertindihan, anda boleh membenamkan struktur "dilucutkan" ini ke dalam struktur anda sendiri yang termasuk medan tambahan, contohnya:

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
}
🎜Hanya marshal/unmarshal 🎜Bidang lain akan dikecualikan secara semula jadi. 🎜

Atas ialah kandungan terperinci Bagaimana untuk melakukan asn1 marshal/unmarshal dan omit fields?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam