Go 将'byte'数组转换为'uint32'数组
我想使用Go 将'byte'数组转换为'uint32'数组,go,Go,我想使用byte数组作为uint32数组,然后获取uint32数组的第一个元素。但是我不能让下面的代码工作。有人能告诉我如何将字节数组转换为单元32数组吗?谢谢 // vim: set noexpandtab tabstop=2: package main import ( "unsafe" "fmt" ) func main() { x := []byte{'\x01', '\x02', '\x03', '\x04', '\
byte
数组作为uint32
数组,然后获取uint32数组的第一个元素。但是我不能让下面的代码工作。有人能告诉我如何将字节
数组转换为单元32
数组吗?谢谢
// vim: set noexpandtab tabstop=2:
package main
import (
"unsafe"
"fmt"
)
func main() {
x := []byte{'\x01', '\x02', '\x03', '\x04', '\x06', '\x07', '\x08', '\x09'}
fmt.Printf("%#v\n", x)
fmt.Printf("%#v\n", []int32(unsafe.Pointer(x))[0])
}
是的
fmt.Printf("%#v\n", (*(*[]int32)(unsafe.Pointer(&x)))[0])
但人们应该记住,它仍然会有len=cap=8
(*),并仔细检查边界本身
表达澄清
unsafe.Pointer(&x) // an uintptr to an `x` slice
(*[]int32)(...) // a type conversion
// it's the same syntax when you do float64(42)
// but in this case you need extra parentheses around the
// type name to make it unambiguous for the parser
// so, it converts a unitptr to a pointer to a int32 slice
*(...) // here it's just a pointer dereference. So you obtain a slice
// from a pointer to a slice, to index it after
(*)
cap
在这种特殊情况下不能保证8
(但这并不重要)。您到底需要做什么?要将8个字节转换为2uint32
s?endianness呢?这能回答你的问题吗?Endian与主机相同。你指的链接不是我要找的。我想强制转换指针,以便可以直接访问强制转换的数组。我不想调用函数来访问uint32的每个元素。不要使用不安全的包。一个简单的(x[0]@user1424739:您根本没有访问“数组”,您只是在操作片头。如果您想直接访问内存,首先必须指向正确的内存。我对(*(*[]int32)(不安全的.Pointer(&x))
的语法感到困惑。您能帮助我理解它吗?(*[]int32)(…)
-此部分是类型转换,与int(42)
的方式相同。前面的*
是取消对指针的引用。