Salin bait ke dalam medan struct menggunakan refleksi

WBOY
Lepaskan: 2024-02-09 09:00:35
ke hadapan
509 orang telah melayarinya

Salin bait ke dalam medan struct menggunakan refleksi

Pengenalan strawberi editor PHP: Dalam pengaturcaraan, kadangkala kita perlu menyalin data bait ke dalam medan struktur. Proses ini boleh dicapai dengan menggunakan refleksi. Refleksi ialah alat yang berkuasa untuk memeriksa dan memanipulasi struktur kod semasa runtime. Melalui refleksi, kita boleh mendapatkan maklumat medan struktur dan menyalin data bait ke dalam struktur mengikut jenis dan susunan medan untuk merealisasikan penukaran dan penugasan data. Pendekatan ini boleh memberi kami kemudahan dan fleksibiliti, membolehkan kami memproses data bait dengan lebih cekap.

Kandungan soalan

Bagaimana untuk mengulang hirisan bait dan menetapkannya ke medan struct?

type s struct {
  f1 []byte
  f2 []byte
  f3 []byte
}

func S s {
  x := s{}
  x.f1 = make([]byte, 4)
  x.f1 = make([]byte, 2)
  x.f1 = make([]byte, 2)
  return x
}

func main() {
  data := []byte{83, 117, 110, 83, 0, 1, 0, 65}

  Z := S()
  //pesudo code from here
  i:= 0
  for field in Z {
    field = data[i:len(field)]
    i += len(field)
  }
Salin selepas log masuk

Harapan:

  • f1 = [83,117,110,83]
  • f2 = [0,1]
  • f3 = [0,65]

Saya pernah melakukan ini sebelum ini dalam c/c++ tetapi saya tidak tahu bagaimana untuk melakukannya secara berterusan. Saya memerlukan fungsi peruntukan generik kerana saya akan mempunyai beberapa struktur yang berbeza, beberapa daripadanya mungkin tidak wujud dalam aliran.

Sebaik-baiknya saya ingin lulus struct yang dimulakan dan kod saya akan mengisi medan struct mereka secara berulang.

Penyelesaian

Gunakan kod pantulan dalam pakej binari/pengekodan.

Langkah 1: Isytiharkan medan sebagai tatasusunan dan bukannya hirisan.

type s struct {
  f1 [4]byte
  f2 [2]byte
  f3 [2]byte
}
Salin selepas log masuk

Langkah 2: Gunakan binary.read untuk menyahkod data ke dalam struktur

var s s
data := []byte{83, 117, 110, 83, 0, 1, 0, 65}
err := binary.read(bytes.newreader(data), binary.littleendian, &s)
if err != nil {
    log.fatal(err)
}
Salin selepas log masuk

Langkah 3: Selesai!

fmt.Print(s) // prints {[83 117 110 83] [0 1] [0 65]}
Salin selepas log masuk

https://www.php.cn/link/42ae1544956fbe6e09242e6cd752444c

Atas ialah kandungan terperinci Salin bait ke dalam medan struct menggunakan refleksi. 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!