538 Stimmen

Zuweisung einer Zeichenkette an ein Byte-Array

Ich möchte String zu Bytes Array zuweisen:

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

Haben Sie eine andere Methode?

12 Stimmen

Wenn die Länge der str größer ist als die Länge von arr dann erhalten Sie die Fehlermeldung "Index außerhalb des Bereichs".

1 Stimmen

[]byte(“abc”) um eine Zeichenkette in ein Byte-Slice zu setzen. Siehe stackoverflow.com/a/62740786/12817546 . string(b) oder eine fmt.Sprintf("%s", b) um einen Byteslice auf einen Stich zu setzen. Siehe stackoverflow.com/a/62725637/12817546 .

747voto

openwonk Punkte 12225

Sicher und einfach:

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

17 Stimmen

Die beste Kodierungspraxis in Go ist die Verwendung eines Byte-Slice []byte y pas eine Reihe von Bytes [20]byte bei der Konvertierung einer Zeichenkette in Bytes... Sie glauben mir nicht? Lesen Sie die Antwort von Rob Pike auf dieses Thema

19 Stimmen

Der OP fragte nach einem Array, nicht nach einem Slice. In einigen Fällen müssen Sie die Größe des Slice begrenzen und stattdessen ein Array verwenden. Meine Antwort unten schneidet die zusätzlichen Zeichen, um sicherzustellen, dass Sie das Array nicht überlaufen.

11 Stimmen

Für diejenigen, denen das etwas seltsam vorkommt: Das ist nur eine Typkonvertierung in Go: golang.org/ref/spec#Umwandlungen

257voto

Alexander Punkte 8919

Zur Konvertierung von einer Zeichenkette in ein Byte-Slice, string -> []byte :

[]byte(str)

Zur Umwandlung eines Arrays in ein Slice, [20]byte -> []byte :

arr[:]

Zum Kopieren einer Zeichenkette in ein Array, string -> [20]byte :

copy(arr[:], str)

Wie oben, jedoch wird die Zeichenkette zuerst explizit in ein Slice umgewandelt:

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

  • Die eingebaute copy Funktion kopiert nur zu ein Stückchen, von ein Stückchen.
  • Arrays sind "die zugrundeliegenden Daten", während Slices "ein Sichtfenster auf die zugrundeliegenden Daten" sind.
  • 使用方法 [:] macht ein Array zu einem Slice.
  • Eine Zeichenkette ist kein Slice, das kopiert werden kann. zu aber sie gilt als ein Stück, das kopiert werden kann von (Zeichenketten sind unveränderlich).
  • Wenn die Zeichenfolge zu lang ist, copy kopiert nur den Teil der Zeichenkette, der passt (und Multi-Byte-Runen werden dann möglicherweise nur teilweise kopiert, was die letzte Rune der resultierenden Zeichenkette beschädigt).

Dieser Code:

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

...ergibt die folgende Ausgabe:

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

Ich habe sie auch auf der Go Spielplatz

0 Stimmen

Vielleicht möchten Sie ein Beispiel für die Umwandlung eines einzelnen Zeichens hinzufügen. Daraus habe ich abgeleitet, dass b[i] = []byte("A")[0] funktioniert, aber b[i] = 'A' ist am Ende viel sauberer.

3 Stimmen

Bei Multi-Byte-Runen funktioniert das nicht: b[1] = ''

0 Stimmen

Eine Frage bleibt offen, die noch niemand beantwortet hat: Ist []byte(str) erstellt ein neues zugrunde liegendes Array mit make() oder nicht? Oder wird nur eine Zeigerkopie auf die ursprüngliche Zeichenfolge zurückgegeben.

124voto

peterSO Punkte 146133

Zum Beispiel,

package main

import "fmt"

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

Ausgabe:

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 Stimmen

Dies ist die einzige Antwort, die tatsächlich auf die ursprüngliche Frage eingeht.

0 Stimmen

Warum sollten Sie 20 Bytes zuweisen, anstatt die tatsächlich benötigte Anzahl an Bytes für die Zeichenkette anzugeben? Wenn die Zeichenfolge weniger als 20 benötigt, ist das nicht etwas ineffizient? Und auch fehleranfällig, wenn sie 20 überschreitet?

1 Stimmen

@Sir: Wir weisen keine 20 Bytes zu. Wir kopieren 3 Bytes, die Länge von s Die Funktion "Kopieren" ist nicht stumm. Anhängen an und Kopieren von Slices : "Die Anzahl der kopierten Elemente ist das Minimum von len(src) und len(dst)."

45voto

Sameh Sharaf Punkte 1093

Ein Kinderspiel:

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

9 Stimmen

Das scheint keine Antwort auf die Frage zu sein. OP wollte die Bytes der Zeichenkette in ein bestehendes Array schreiben, das länger als die Zeichenkette sein könnte.

2 Stimmen

Verwendung von Scheiben []byte wird gegenüber Arrays bevorzugt [20]byte . Die Antwort ist auf der Grundlage bewährter Verfahren korrekt; wenn Spezifikationen oder Code Arrays erfordern, dann verwenden Sie copy statt (siehe Beispiele an anderer Stelle in diesem Thema).

31voto

chespinoza Punkte 2608

Ich denke, es ist besser

package main

import "fmt"

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

Sehen Sie hier nach: http://play.golang.org/p/vpnAWHZZk7

4 Stimmen

Es ist nicht besser. Es ist falsch. Es tut nicht das, wonach die Frage gestellt wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X