2010-11-29 50 views
1

Je viens de commencer hier avec Go alors je m'excuse d'avance pour la question idiote.Conversion de plusieurs octets dans un tableau vers un autre type Go

Imaginez que j'ai un tableau d'octets tels que:

func main(){ 
    arrayOfBytes := [10]byte{1,2,3,4,5,6,7,8,9,10} 
} 

Maintenant, si je me sentais comme prendre les quatre premiers octets de ce tableau et l'utiliser comme un entier? Ou peut-être que j'ai un struct qui ressemble à ceci:

type eightByteType struct { 
    a uint32 
    b uint32 
} 

Puis-je facilement les 8 premiers octets de mon tableau et la transformer en un objet de type eightByteType? Je sais que ce sont deux questions différentes, mais je pense qu'ils peuvent avoir des réponses similaires. J'ai parcouru la documentation et n'ai pas vu un bon exemple pour y parvenir. Etre capable de jeter un bloc d'octets à n'importe quoi est une des choses que j'aime vraiment chez C. J'espère que je peux toujours le faire dans Go.

Répondre

2

Regardez encoding/binary, ainsi que bytes.Buffer

TL; la version DR:

import (
    "encoding/binary" 
    "bytes" 
) 

func main() { 
    var s eightByteType 
    binary.Read(bytes.NewBuffer(array[:]), binary.LittleEndian, &s) 
} 

Quelques choses à noter ici: nous passons array [:], vous pourriez aussi déclarer votre tableau en tant que tranche à la place ([]byte{1, 2, 3, 4, 5}) et laissez le compilateur s'inquiéter des tailles, etc, et eightByteType ne fonctionnera pas comme est (IIRC) parce que binary.Read ne touchera pas les champs privés. Cela fonctionnerait:

type eightByteType struct { 
    A, B uint32 
} 
+0

C'était excellent! Merci beaucoup! –

+0

Est-ce que ce code copie réellement les données du tableau vers la structure? – ithkuil

+0

@ithkuil que voulez-vous dire? En fait copier plutôt que quoi? – cthom06