我想把字符串赋值给bytes数组:
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
还有别的方法吗?
我想把字符串赋值给bytes数组:
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
还有别的方法吗?
当前回答
安全简单:
[]byte("Here is a string....")
其他回答
string -> []byte用于将字符串转换为字节切片:
[]byte(str)
将数组转换为切片,使用[20]byte -> []byte:
arr[:]
将字符串复制到数组,使用string -> [20]byte:
copy(arr[:], str)
与上面相同,但首先显式地将字符串转换为slice:
copy(arr[:], []byte(str))
The built-in copy function only copies to a slice, from a slice. Arrays are "the underlying data", while slices are "a viewport into underlying data". Using [:] makes an array qualify as a slice. A string does not qualify as a slice that can be copied to, but it qualifies as a slice that can be copied from (strings are immutable). If the string is too long, copy will only copy the part of the string that fits (and multi-byte runes may then be copied only partly, which will corrupt the last rune of the resulting string).
这段代码:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
...给出如下输出:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
我还在围棋游乐场提供了它
数组是值…切片更像指针。也就是说[n]类型与[]类型不兼容,因为它们本质上是两种不同的东西。你可以通过使用arr[:]来获取一个指向数组的切片,它返回一个有arr作为后台存储的切片。
将例如[]字节的切片转换为[20]字节的一种方法是实际分配一个[20]字节,您可以使用var [20]byte(因为它是一个值…不需要make),然后复制数据到它:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
从本质上讲,很多其他答案都是错误的,即[]类型不是一个数组。
[n]T和[]T是完全不同的东西!
当使用reflect时,[]T不是数组而是Slice,而[n]T是数组。
你也不能使用map[[]byte]T,但是你可以使用map[[n]byte]T。
这有时会很麻烦,因为很多函数都在[]字节上操作,而一些函数返回[n]字节(最明显的是crypto/*中的哈希函数)。 例如,sha256哈希是[32]字节而不是[]字节,所以当初学者尝试将其写入文件时,例如:
sum := sha256.Sum256(data)
w.Write(sum)
他们会得到一个错误。正确的方法是使用
w.Write(sum[:])
但是,你到底想要什么?只是按字节访问字符串?您可以使用以下方法轻松地将字符串转换为[]字节:
bytes := []byte(str)
但这不是数组,而是切片。另外,byte != rune。如果你想操作“字符”,你需要使用符文…不是字节。
除了上面提到的方法,你还可以做一个小技巧
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
Go Play: http://play.golang.org/p/xASsiSpQmC
你不应该使用这个:-)
最终创建了特定于数组的方法来实现这一点。很像每个int类型都有特定方法的编码/二进制包。例如binary.BigEndian。uint16 PutUint16([]字节)。
func byte16PutString(s string) [16]byte {
var a [16]byte
if len(s) > 16 {
copy(a[:], s)
} else {
copy(a[16-len(s):], s)
}
return a
}
var b [16]byte
b = byte16PutString("abc")
fmt.Printf("%v\n", b)
输出:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
请注意,我希望填充在左边,而不是右边。
http://play.golang.org/p/7tNumnJaiN
我认为这样更好。
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
点击这里查看:http://play.golang.org/p/vpnAWHZZk7