什么是最有效的方式(性能)转换[]uint32,并从[]byte在Golang?
[]uint32
[]byte
例如:
func main() { source := []uint32{1,2,3} dest := make([]byte, 4 * len(source)) // source to dest // ? check := len(dest)/4 // dest to check // ? }
我有一个解决方案,但它包含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) }
我怀疑你是在追逐这样的游乐场
调整LittleEndian为BigEndian适当的
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) }