首页 文章

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

提问于
浏览
250

我想将字符串分配给bytes数组:

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

有另一种方法吗?

9 回答

  • 2

    安全简单:

    []byte("Here is a string....")
    
  • 80

    例如,

    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]
    
  • 18

    要从字符串转换为字节切片, string -> []byte

    []byte(str)
    

    要将数组转换为切片, [20]byte -> []byte

    arr[:]
    

    要将字符串复制到数组, string -> [20]byte

    copy(arr[:], str)
    

    与上面相同,但首先将字符串显式转换为切片:

    copy(arr[:], []byte(str))
    

    • 内置 copy 函数仅从切片复制到切片 .

    • 数组是"the underlying data",而切片是"a viewport into underlying data" .

    • 使用 [:] 使数组有资格作为切片 .

    • 字符串有资格作为切片 .

    • 如果字符串太长, 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上发了

  • -1

    小菜一碟:

    arr := []byte("That's all folks!!")
    
  • 38

    我认为它更好..

    package main
    
    import "fmt"
    
    func main() {
        str := "abc"
        mySlice := []byte(str)
        fmt.Printf("%v -> '%s'",mySlice,mySlice )
    }
    

    点击这里:http://play.golang.org/p/vpnAWHZZk7

  • 91

    Go,将字符串转换为字节切片

    您需要一种快速方法将[]字符串转换为[]字节类型 . 在诸如将文本数据存储到随机访问文件或需要输入数据为[]字节类型的其他类型的数据操作的情况下使用 .

    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

  • -1

    除了上面提到的方法,你也可以做一个技巧

    s := "hello"
    b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
    

    去玩:http://play.golang.org/p/xASsiSpQmC

    你永远不应该使用这个:-)

  • 394

    结束创建数组特定方法来执行此操作 . 与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

  • -1

    数组是值...切片更像是指针 . 那是 [n]type[]type 不兼容,因为它们基本上是两个不同的东西 . 您可以使用 arr[:] 获取指向数组的切片,该切片返回具有 arr 作为其后备存储的切片 .

    将一个例如 []byte 的切片转换为 [20]byte 的一种方法是实际分配 [20]byte ,你可以使用 var [20]byte (因为它是一个值......不需要 make ),然后将数据复制到其中:

    buf := make([]byte, 10)
    var arr [10]byte
    copy(arr[:], buf)
    

    基本上许多其他答案出错的是 []type 不是一个数组 .

    [n]T and []T are completely different things!

    当使用反射 []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 . 如果你想在"characters"上操作,你需要使用 rune ...而不是 byte .

相关问题