web-dev-qa-db-fra.com

Comment assigner une chaîne à un tableau d'octets

Je veux affecter une chaîne à un tableau d'octets:

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

Avoir une autre méthode?

326
sofire

Sûr et simple:

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

Pour convertir une chaîne en une tranche d'octet, string -> []byte:

[]byte(str)

Pour convertir un tableau en une tranche, [20]byte -> []byte:

arr[:]

Pour copier une chaîne dans un tableau, string -> [20]byte:

copy(arr[:], str)

Comme ci-dessus, mais en convertissant explicitement la chaîne en une tranche:

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

  • La fonction intégrée copy ne copie que dans une tranche, à partir de une tranche.
  • Les tableaux sont "les données sous-jacentes", tandis que les tranches sont "une fenêtre d'affichage dans les données sous-jacentes".
  • En utilisant [:], un tableau est qualifié de tranche.
  • Une chaîne ne peut être considérée comme une tranche pouvant être copiée dans , mais comme une tranche pouvant être copiée à partir de ( les chaînes sont immuables).
  • Si la chaîne est trop longue, copy ne copiera que la partie de la chaîne qui convient.

Ce code:

var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)

... donne la sortie suivante:

array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)

Je l'ai également rendu disponible au Go Playground

122
Alexander

Par exemple,

package main

import "fmt"

func main() {
    s := "abc"
    var a [20]byte
    copy(a[:], s)
    fmt.Println("s:", []byte(s), "a:", a)
}

Sortie:

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

Part de gâteau:

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

Je pense que c'est mieux..

package main

import "fmt"

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

Vérifiez ici: http://play.golang.org/p/vpnAWHZZk7

24
chespinoza

Allez, convertissez une chaîne en une tranche d'octets

Vous avez besoin d'un moyen rapide de convertir une chaîne [] en type [] octet. À utiliser dans des situations telles que le stockage de données texte dans un fichier à accès aléatoire ou tout autre type de manipulation de données nécessitant que les données d'entrée soient de type [] octets.

package main

func main() {

    var s string

    //...

    b := []byte(s)

    //...
}

ce qui est utile lors de l'utilisation de ioutil.WriteFile, qui accepte une tranche d'octets comme paramètre de données:

WriteFile func(filename string, data []byte, perm os.FileMode) error

Un autre exemple

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

Sortie:

[104 101 108 108 111 32 119 111 114 108 100] bonjour le monde

S'il vous plaît vérifier le lien terrain de je

7
ASHWIN RAJEEV

Nous avons fini par créer des méthodes spécifiques au tableau pour ce faire. Tout comme le package encoding/binary avec des méthodes spécifiques pour chaque type int. Par exemple, 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)

Sortie:

[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]

Remarquez comme je voulais un rembourrage à gauche et non à droite.

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

0
DavidG