web-dev-qa-db-ja.com

文字列をbytes配列に割り当てる方法

文字列をbytes配列に代入したいです。

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

別の方法がありますか?

298
sofire

安全で簡単:

[]byte("Here is a string....")
456
openwonk

文字列からバイトスライスに変換する場合、string -> []byte

[]byte(str)

配列をスライスに変換するには、[20]byte -> []byte

arr[:]

文字列を配列にコピーするには、string -> [20]byte

copy(arr[:], str)

上記と同じですが、最初に文字列をスライスに明示的に変換します。

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

  • 組み込みのcopy関数はaスライスに、aスライスにコピーするだけです。
  • 配列は「基本データ」であり、スライスは「基本データへのビューポート」です。
  • [:]を使用すると、配列はスライスとして修飾されます。
  • 文字列は から にコピーできるスライスとしては認められませんが、 から にコピーできるスライスとしては認められます。
  • 文字列が長すぎる場合、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 でも利用可能にしました

105
Alexander

例えば、

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]
104
peterSO

ケーキ

arr := []byte("That's all folks!!")
40
Sameh Sharaf

もっといいと思います。

package main

import "fmt"

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

ここでチェックしてください: http://play.golang.org/p/vpnAWHZZk7

23
chespinoza

文字列をバイトスライスに変換する

あなたは[]文字列を[] byte型に変換する速い方法が必要です。テキストデータをランダムアクセスファイルに保存する場合や、入力データを[]バイト型にする必要があるその他の種類のデータ操作などの状況で使用する。

package main

func main() {

    var s string

    //...

    b := []byte(s)

    //...
}

dataパラメータとしてバイトスライスを受け入れる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 111 119 119 114 108 100]こんにちは世界

リンクをチェックしてください 遊び場

5
ASHWIN RAJEEV

これを行うために配列固有のメソッドを作成することになりました。 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

0
DavidG