2015-03-15 7 views
7

Ich versuche, ein Uint32 zu einem Byte-Array (4 Bytes) in Go mit der zu konvertieren unsichere Bibliothek:golang: konvertiert Uint32 (oder einen anderen eingebauten Typ) in [] Byte (in eine Datei geschrieben werden)

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h) 
a := make([]byte, unsafe.Sizeof(h)) 
copy(a, *(*[]byte)(unsafe.Pointer(&h))) 

die ersten beiden Zeilen sind korrekt, aber dann bekomme ich einen Laufzeitfehler (unerwartete Fehleradresse) an dem Kopie Anruf.

Der nächste Schritt wäre schreiben

_, err = fi.Write(a) 

zu schreiben, um das 4 Bytes in eine Datei zu nennen sein.

Ich habe andere Fragen mit einem ähnlichen Thema, aber keine mit einem funktionierenden Code gefunden. Ich bin mir auch bewusst, dass unsichere ist unsicher.

Jede Hilfe würde sehr geschätzt werden.

+0

Haben Sie es tun müssen, um die unsichere Paket mit? – inf

+0

nicht unbedingt, aber 1) Ich habe einige Stunden mit diesem Problem verbracht und würde gerne die Lösung kennen, 2) Ich brauche, dass die Datei (wie mit einem Hex-Editor analysiert) die Uint32 ohne Extra-Last hat, 3) die Lösung sollte auch mit float32 funktionieren. Ich schreibe sowohl das Programm, das die Datei schreibt, als auch das Programm, das die Datei liest (dasselbe Betriebssystem). –

+0

Ich sehe, für die einfache Verwendung würde ich die 'Write' und' Read' Methoden des ['binary'] (https://godoc.org/encoding/binary#Write) Pakets empfehlen. Angesichts ihrer Verwendung von Schnittstellen könnten sie einige Gemeinkosten haben. – inf

Antwort

7

Hier ist eine Möglichkeit, es zu tun:

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h) 
a := (*[4]byte)(unsafe.Pointer(&h))[:] 

Hier ist eine Aufschlüsselung von dem, was vor sich geht. Der Code

(*[4]byte)(unsafe.Pointer(&h)) 

konvertiert den Uint32-Zeiger in einen [4] Byte-Zeiger. Am Ende erzeugt ein Strich am [4] Byte eine Scheibe. Der Code in der Frage interpretiert den uint32 als slice header. Das resultierende Segment ist nicht gültig und copy Fehler.

Ein alternativer Ansatz, der nicht unsicher nicht verwendet ist das encoding/binary Paket zu verwenden:

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h) 
a := make([]byte, 4) 
binary.LittleEndian.PutUint32(a, h)