2016-04-05 8 views
2

[]uint32をゴーランの[]byteに変換する最も効率的な方法は何ですか?例えばゴランの[uint32]から[]バイトに変換してください。

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

私はsolutionを持っているが、それはdiv要素で構成、MOD、および

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.コードの第4因子は、型変換を望まないが、何らかの理由であなたの[] uint32の生メモリを取得することを示唆しています。 2.エンディアンはどうですか? 3.「最も効率的な方法」は具体的ではありません。どの意味で効率的ですか? CPUサイクル、メモリ、コード行、互換性、理解度? – Volker

+0

それはappengineにあるので、私は実際に彼らがどのような種類のマシンを使用しているのかわからない、最大の可能性はリトルエンディアンです。パフォーマンス面で効率的 – Kokizzu

答えて

4

を掛け、私はあなたがこのPlayground

ためLittleEndianを調整するようなものの後にある疑いがありますBigEndianと適宜

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

少し異なるアプローチですが、それはbinary_writeでタイプアサーションを保存するので、少し効率的です:http://play.golang.org/p/ypoFpYt2QF – OneOfOne

関連する問題