Heim  >  Artikel  >  Backend-Entwicklung  >  golang byte转struct

golang byte转struct

PHPz
PHPzOriginal
2023-05-15 09:07:361341Durchsuche

Das Konvertieren eines Byte-Arrays in eine Struktur in Golang ist ein häufiges Problem, auf das viele Entwickler stoßen. Das Byte-Array von Golang ist sehr praktisch für die Verarbeitung von Binärdaten, aber für komplexe Datenstrukturen wie Strukturen ist eine manuelle Verarbeitung erforderlich. Dieser Code ist langwierig und fehleranfällig. In diesem Artikel wird erläutert, wie Sie ein Byte-Array mithilfe von Golang in eine Struktur konvertieren.

1. Durch unsichere Konvertierung

Wir können Pointer im unsicheren Paket verwenden, um zwischen Byte-Arrays und Strukturen zu konvertieren. Der Beispielcode lautet wie folgt:

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Tom", Age: 18}

    size := int(unsafe.Sizeof(p))
    fmt.Printf("struct size: %d
", size)

    b := make([]byte, size)
    pptr := unsafe.Pointer(&p)

    for i := 0; i < size; i++ {
        b[i] = *(*byte)(unsafe.Pointer(uintptr(pptr) + uintptr(i)))
    }

    fmt.Printf("byte array: %v
", b)

    q := (*Person)(unsafe.Pointer(&b[0]))
    fmt.Printf("person: %v
", q)
}

Im obigen Code erstellen wir eine Personenstruktur, konvertieren sie in ein Byte-Array und wandeln sie über einen Zeiger wieder in die Personenstruktur um. Wir verwenden Pointer und uintptr aus dem unsicheren Paket, um zwischen Zeigern und Ganzzahlen zu konvertieren.

Nach dem Ausführen dieses Codes lautet das Ausgabeergebnis wie folgt:

struct size: 16
byte array: [84 111 109 0 0 0 0 0 0 0 0 0 18 0 0 0]
person: &{Tom 18}

Obwohl diese Methode eine Konvertierung erreichen kann, birgt sie bestimmte Sicherheitsrisiken und muss mit Vorsicht verwendet werden.

2. Konvertierung durch Reflect

Das Reflect-Paket ist ein sehr leistungsfähiges Paket in Golang. Sie können es verwenden, um Typinferenzen für Variablen durchzuführen und Funktionen aufzurufen. Bei der Konvertierung zwischen Byte-Array und Struktur können wir Value und Type aus dem Reflect-Paket verwenden. Der Beispielcode lautet wie folgt:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Tom", Age: 18}

    size := int(reflect.TypeOf(p).Size())
    fmt.Printf("struct size: %d
", size)

    b := make([]byte, size)
    reflect.ValueOf(&p).Elem().Interface()
    for i := 0; i < size; i++ {
        b[i] = *(*byte)(unsafe.Pointer(uintptr(reflect.ValueOf(&p).Elem().UnsafeAddr()) + uintptr(i)))
    }

    fmt.Printf("byte array: %v
", b)

    var q Person
    s := reflect.ValueOf(&q).Elem()
    for i := 0; i < size; i++ {
        s.Field(i).SetInt(int64(b[i]))
    }

    fmt.Printf("person: %v
", q)
}

Wir verwenden Typ und Wert im Reflect-Paket, um die Größe und den Wert der Struktur abzurufen, und erhalten den Zeiger der Struktur im Speicher über Reflect.ValueOf(&p).Elem().UnsafeAddr () und verwenden Sie dann uintptr und unsafe.Pointer für die Typkonvertierung und durchlaufen Sie schließlich das Byte-Array zur Zuweisung, um das Byte-Array in eine Struktur umzuwandeln.

Nachdem dieser Code ausgeführt wurde, lautet die Ausgabe wie folgt:

struct size: 16
byte array: [84 111 109 0 0 0 0 0 0 0 0 0 18 0 0 0]
person: {Tom 84}

Aufgrund der unterschiedlichen Speicherreihenfolge zwischen Byte-Array und Struktur müssen wir die Reihenfolge des Byte-Arrays manuell verwalten, um eine korrekte Konvertierung in eine Struktur durchzuführen.

Zusammenfassung

Es gibt zwei Möglichkeiten, Byte-Arrays und Strukturen in Golang zu konvertieren: Eine besteht darin, das unsichere Paket zum Konvertieren zwischen Zeigern, Ganzzahlen und Byte-Arrays zu verwenden, und die andere darin, das Reflect-Paket zum Konvertieren von Typen und Werten zu verwenden ., Konvertierung zwischen Adressen. Beide Methoden haben ihre eigenen Vor- und Nachteile, und Sie müssen sie je nach Situation auswählen, wenn Sie sie verwenden. Gleichzeitig müssen Sie beim Konvertieren von Byte-Arrays und Strukturen auf Details wie die Reihenfolge der Byte-Arrays und die Feldtypen in der Struktur achten.

Das obige ist der detaillierte Inhalt vongolang byte转struct. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn