2017-10-25 3 views
-1

Ich habe die folgenden zwei Strukturengolang - Bestücken Array of Structure

 type AAAA struct{ 
     Aa [2]byte 
     Ab [2]byte 
     Ac [3]byte 
    }  
    type BBBB struct{ 
     Ba [4]byte 
     Bb [2]byte 
     Bc [3]byte 
     Bd [2]byte // No Of Struct AAA Items 
     BBStr []AAAA 
    } 

So Struct BBB ist in Struct AAA Wiederholung

Dann habe ich eine Zeichenfolge, die ich als Eingabe haben, die den Wert der enthält Struktur als Eingabe

Eingang kommen: = "aaaabbccc02ddeefffddeefff" (hier 02 ist in Struct BBBB keine Zeit wiederholt Struct AAAA)

ich muss durch den Eingang lesen st Ring und bevölkern die Struktur BBBB einschließlich der Anordnung der Struktur AAA

Ich schrieb die Funktion unten, um dies zu erreichen. Aber ich bin immer "Bad Fehler - binary.Read: ungültiger Typ * main.BBBB

bei der Identifizierung, warum dieser Fehler Sie brauchen Hilfe Auch ist es eine Möglichkeit, dies zu tun anders

func main() { 
     input := "aaaabbccc02ddeefffddeefff" 
     var k BBBB 
     var j AAAA 
     k.BBStr = append(k.BBStr,j) 
     k.BBStr = append(k.BBStr,j) 
     xyz := []byte(input) 
     err := binary.Read(bytes.NewReader(xyz), binary.LittleEndian, &k) 
     if err != nil { 
      fmt.Println("Bad error - ",err) 
     } 
     fmt.Println("Structure Definition - ",k) 
    } 
+1

Das Binärpaket kann nur automatisch in Werte fester Größe decodiert werden. Es kann nicht wissen, dass das 'Bd'-Feld ein uint16 (?) Ist, das anzeigt, wie viele AAAAs folgen. Sie müssen etwas tun, wenn die Decodierung manuell erfolgt. – JimB

+0

ok Ich dachte, wenn ich die AAAA in BBBB die richtige Anzahl von Malen sollte es in der Lage sein, die vollständige Byte-Zeichenfolge zu lesen. Danke für Ihre Hilfe, obwohl @JimB – MKS

Antwort

0

Die vorliegende Dokumentation? https://golang.org/pkg/encoding/binary/#Read sagt:

Daten ein Zeiger auf einen Wert fester Größe oder eine Scheibe mit fester Größe Werte sein müssen

was bedeutet, dass die siz. e des Typs Sie Read muss zur Kompilierzeit bekannt sein. Ihr struct BBBB enthält ein Stück []AAAA, was bedeutet, dass seine Länge nur zur Laufzeit bekannt ist. Wenn Sie es zu einem Array fester Größe machen, z.B. [16]AAAA, es würde funktionieren.