2016-04-05 218 views
2

在Golang中將[]uint32轉換爲[]byte的最有效方法是什麼?在golang中將[] 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.什麼是endianess? 3.「最有效的方式」還不夠具體:從什麼意義上來說是不舒服的? CPU週期,內存,代碼行,兼容性,可理解性? – Volker

+0

它在appengine上,所以我真的不知道他們使用什麼樣的機器,最大的可能性是小端。在性能方面效率很高 – Kokizzu

回答

4

我懷疑你是這樣的事情Playground

後調整LittleEndianBigEndian視情況而定

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

略有不同的方法,因爲它將二進制類型斷言保存在二進制文件中,所以效率稍高一點。寫:http://play.golang.org/p/ypoFpYt2QF – OneOfOne

相關問題