英文:
Convert []uint32 to []byte and vice versa in golang
问题
在Golang中,将[]uint32
转换为[]byte
并从[]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
// ?
}
我有一个解决方案,但它包含了除法、取模和乘法操作。
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)
}
英文:
What's the most efficient way (in performance) to convert []uint32
to and from []byte
in Golang?
for example:
func main() {
source := []uint32{1,2,3}
dest := make([]byte, 4 * len(source))
// source to dest
// ?
check := len(dest)/4
// dest to check
// ?
}
I have a solution but it consist div, mod, and multiply
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)
}
答案1
得分: 9
我怀疑你想要这样的东西 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)
}
英文:
I suspect you are after something like this Playground
Adjust LittleEndian
for BigEndian
as appropriate
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论