2016-04-05 21 views
2

[]uint32 - Golang'daki []byte dönüştürmek için en etkili yol (performansta) nedir? örneğin[] uint32 - [] byte ve tam tersi için dönüşüm yapın

:

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

Ben solution ama ibaret div, mod var ve sizin için LittleEndian ayarlayın bu Playground

gibi bir şey sonra şüpheli

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. Kodunuzdaki "4" faktörü, tür dönüşümü istemediğinizi, ancak bir şekilde [] uint32 öğenizin işlenmemiş belleğini aldığınızı gösterir. 2. Endianess hakkında ne düşünüyorsunuz? 3. "En verimli yol" yeterince spesifik değildir: Hangi anlamda Effizient? CPU döngüleri, bellek, kod satırları, uyumluluk, anlaşılırlık? – Volker

+0

appengine üzerinde, bu yüzden ne tür bir makine kullandıklarını bilmiyorum, en büyük olasılık küçük endian. performans açısından verimli – Kokizzu

cevap

4

çarpın BigEndian uygun şekilde

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

Biraz farklı bir yaklaşım, bu tür iddiayı binary olarak kaydettiğinden biraz daha etkilidir.Write: http://play.golang.org/p/ypoFpYt2QF – OneOfOne

İlgili konular