2016-04-05 17 views
2

Was ist die effizienteste Art und Weise (in Leistung) []uint32 zu und von []byte in Golang zu konvertieren?Convert [] Uint32 in [] Byte und umgekehrt in Golang

zum Beispiel:

func main() { 
    source := []uint32{1,2,3} 
    dest := make([]byte, 4 * len(source)) 
    // source to dest 
    // ? 
    check := len(dest)/4 
    // dest to check 
    // ? 
} 

Ich habe ein solution aber es besteht div, mod, und multiplizieren

package main 
import (
    "fmt" 
) 
func main() { 
    source := []uint32{1,2,3} 
    dest := make([]byte, 4*len(source)) 
    fmt.Println(source) 
    for start, v := range source { 
     dest[start*4+0] = byte(v % 256) 
     dest[start*4+1] = byte(v/256 % 256) 
     dest[start*4+2] = byte(v/256/256 % 256) 
     dest[start*4+3] = byte(v/256/ 256/ 256% 256) 
    } 
    fmt.Println(dest) 
    check := make([]uint32,cap(dest)/4) 
    for start := 0; start<len(check); start++ { 
     check[start] = uint32(dest[start*4+0]) + uint32(dest[start*4+1]) * 256 + uint32(dest[start*4+2]) * 256 * 256 + uint32(dest[start*4+3]) * 256 * 256 * 256 
    } 
    fmt.Println(check) 
} 
+0

1. Der Faktor '4' in Ihrem Code deutet darauf hin, dass Sie keine Typkonvertierung wünschen, aber irgendwie die rohe Erinnerung von Ihrem [] uint32 bekommen. 2. Was ist mit Endianess? 3. "Der effizienteste Weg" ist nicht spezifisch genug: Effizient in welchem ​​Sinne? CPU-Zyklen, Speicher, Codezeilen, Kompatibilität, Verständlichkeit? – Volker

+0

es ist auf appengine, so dass ich nicht wirklich weiß, welche Art von Maschine sie verwenden, größte Möglichkeit ist Little Endian. effizient in Bezug auf die Leistung – Kokizzu

Antwort

4

Ich vermute, Sie sind nach so etwas wie diese Playground

einstellen LittleEndian für BigEndian als geeignet

package main 

import (
    "bytes" 
    "encoding/binary" 
    "fmt" 
) 

func main() { 
    buf := new(bytes.Buffer) 
    source := []uint32{1, 2, 3} 
    err := binary.Write(buf, binary.LittleEndian, source) 
    if err != nil { 
     fmt.Println("binary.Write failed:", err) 
    } 
    fmt.Printf("Encoded: % x\n", buf.Bytes()) 

    check := make([]uint32, 3) 
    rbuf := bytes.NewReader(buf.Bytes()) 
    err = binary.Read(rbuf, binary.LittleEndian, &check) 
    if err != nil { 
     fmt.Println("binary.Read failed:", err) 
    } 
    fmt.Printf("Decoded: %v\n", check) 

} 
+2

Ein etwas anderer Ansatz, es ist ein bisschen effizienter, da es die Typ Assertion in binary.Write speichert: http://play.golang.org/p/ypoFpYt2QF – OneOfOne