2016-04-05 176 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

相关问题