我想将字符串分配给bytes array:
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
有另一种方法吗?
答案 0 :(得分:459)
安全而简单:
[]byte("Here is a string....")
答案 1 :(得分:106)
要从字符串转换为字节切片,string -> []byte
:
[]byte(str)
要将数组转换为切片,[20]byte -> []byte
:
arr[:]
将字符串复制到数组string -> [20]byte
:
copy(arr[:], str)
与上面相同,但首先将字符串显式转换为切片:
copy(arr[:], []byte(str))
copy
功能仅将复制到切片,从切片。[:]
使数组有资格作为切片。copy
将仅复制适合的字符串部分。此代码:
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)
上提供了它
答案 2 :(得分:105)
例如,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
输出:
s: [97 98 99] a: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
答案 3 :(得分:40)
一块蛋糕:
arr := []byte("That's all folks!!")
答案 4 :(得分:24)
我认为这样更好..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
答案 5 :(得分:5)
您需要一种将[]字符串转换为[] byte类型的快速方法。在诸如将文本数据存储到随机访问文件或需要输入数据为[] byte类型的其他类型的数据操纵等情况下使用。
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
当使用ioutil.WriteFile时非常有用,该文件接受字节切片作为其数据参数:
WriteFile func(filename string, data []byte, perm os.FileMode) error
另一个例子
package main
import (
"fmt"
"strings"
)
func main() {
stringSlice := []string{"hello", "world"}
stringByte := strings.Join(stringSlice, " ")
// Byte array value
fmt.Println([]byte(stringByte))
// Corresponding string value
fmt.Println(string([]byte(stringByte)))
}
输出:
[104 101 108 108 111 32 119 111 114 108 100]你好,世界
请检查链接playground
答案 6 :(得分:-1)
除了上面提到的方法,你还可以做一个技巧
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
去玩:http://play.golang.org/p/xASsiSpQmC
你永远不应该使用它: - )
答案 7 :(得分:-1)
结束创建数组特定方法来执行此操作。很像encoding/binary包,每个int类型都有特定的方法。例如binary.BigEndian.PutUint16([]byte, uint16)
。
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]
注意我想要左边的填充,而不是右边的填充。
答案 8 :(得分:-1)
数组是值...切片更像是指针。那是[n]type
与[]type
不兼容,因为它们基本上是两个不同的东西。您可以使用arr[:]
获取指向数组的切片,该切片返回具有arr
作为其后备存储的切片。
将一个例如[]byte
的片段转换为[20]byte
的一种方法是实际分配[20]byte
,您可以使用var [20]byte
(因为它'} sa值...不需要make
)然后将数据复制到其中:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
基本上,许多其他答案出错的是[]type
不是数组。
[n]T
和[]T
完全不同!
当使用reflect []T
时,不是类型数组而是类型Slice和[n]T
是类型数组。
您也无法使用map[[]byte]T
,但可以使用map[[n]byte]T
。
这有时会很麻烦,因为许多函数在[]byte
上运行,而有些函数返回[n]byte
(最值得注意的是crypto/*
中的哈希函数)。
sha256哈希例如是[32]byte
而不是[]byte
所以当初学者尝试将其写入文件时,例如:
sum := sha256.Sum256(data)
w.Write(sum)
他们会收到错误。正确的方法是使用
w.Write(sum[:])
然而,你想要的是什么?只是按字节顺序访问字符串?您可以使用以下方式轻松将string
转换为[]byte
bytes := []byte(str)
但这不是一个数组,它只是一个切片。另外,byte
!= rune
。如果你想操作"字符"您需要使用rune
...而不是byte
。