Bagaimana untuk melakukan asn1 marshal/unmarshal dan omit fields?

PHPz
Lepaskan: 2024-02-09 10:57:08
ke hadapan
497 orang telah melayarinya

如何进行 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)
Salin selepas log masuk

Struktur akan berjaya disusun, bagaimanapun, apabila memeriksa struktur menggunakan Bash base64 -d b64.txt > b64.txt.der Saya masih melihat asn1:"-"< The / kod> 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</code ></a> Tidak. Kenapa, ini bukan tempatnya. Matlamat utama menerima <code>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
}
Salin selepas log masuk
🎜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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!