如何将字符串分配给bytes数组

时间:2011-11-07 02:29:58

标签: go

我想将字符串分配给bytes array:

var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
  arr[k] = byte(v)
}

有另一种方法吗?

9 个答案:

答案 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)

我也在Go Playground

上提供了它

答案 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 )
}

点击此处:http://play.golang.org/p/vpnAWHZZk7

答案 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]

注意我想要左边的填充,而不是右边的填充。

http://play.golang.org/p/7tNumnJaiN

答案 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