So konvertieren Sie in der Go-Programmierung von [] Byte nach Int

73

Ich muss ein Client-Server-Beispiel über TCP erstellen. Auf der Client-Seite lese ich 2 Nummern und sende sie an den Server. Das Problem, mit dem ich konfrontiert war, ist, dass ich nicht von []bytenach konvertieren kann int, da die Kommunikation nur Daten vom Typ akzeptiert []byte.

Gibt es eine Möglichkeit zur Umwandlung []bytezu intoder ich senden kann , intan den Server?

Einige Beispielcodes werden sehr geschätzt.

Vielen Dank.

Emanuel
quelle
Schreiben Sie zur Verdeutlichung der Aufgabe sowohl den Client- als auch den Servercode? Und sind beide in Go geschrieben?
Sonia
AFAIK du musst Bit Shift machen.
Fiorix
Um Daten an das Netzwerk zu senden, müssen sie in Byteform vorliegen.
IanB

Antworten:

81

(Reposting dieser Antwort )

Sie können den ByteOrder von encoding / binary verwenden , um dies für 16-, 32- und 64-Bit-Typen zu tun

abspielen

package main

import "fmt"
import "encoding/binary"

func main() {
    var mySlice = []byte{244, 244, 244, 244, 244, 244, 244, 244}
    data := binary.BigEndian.Uint64(mySlice)
    fmt.Println(data)
}
David Budworth
quelle
4
Was meinst du mit Offsets? wie in, aus der Mitte eines [] Bytes lesen? Mach einfach BigEndian.Uint64 (bigSlice [10:18]) (lies im Grunde die Bytes in der Mitte des Slice. Oder meinst du etwas anderes?
David Budworth
2
Ja, dachte ich mir, nachdem ich die dumme Frage gestellt hatte. Kann es einfach nicht bearbeiten: D Danke.
Majidarif
4
Es gibt uint16, uint32, unit64 zurück, aber nicht int. Müssen von uint nach int konvertieren
Tinkaal Gogoi
Ein bisschen offensichtlich, aber zunächst nicht, wenn man nur Byte [] nach Int gehen möchte: Dies funktioniert nicht in einem Fall, in dem das Byte-Array sehr klein ist. In einem meiner Fälle habe ich ein Byte-Array mit nur 2 Elementen, und die Uint64Methode schlägt in dieser Zeile in der Quelle fehl _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808, da der Index offensichtlich außerhalb der Grenzen liegt. Ich brauchte die Uint16Methode.
ThePartyTurtle
@TinkalGogoi verwendet int64 (Wert), um einen Wert in einen int64 zu konvertieren.
Bill Burdick
11

Ausgehend von einem Byte-Array können Sie die Konvertierungen mit dem Binärpaket durchführen .

Zum Beispiel, wenn Sie Ints lesen möchten:

buf := bytes.NewBuffer(b) // b is []byte
myfirstint, err := binary.ReadVarint(buf)
anotherint, err := binary.ReadVarint(buf)

Das gleiche Paket ermöglicht das Lesen von Int oder Floats ohne Vorzeichen mit den gewünschten Bytereihenfolgen mithilfe der allgemeinen Lesefunktion .

Denys Séguret
quelle
11
Varint ist spezifisch für Protokollpuffer und wahrscheinlich nicht das, wonach Sie suchen. Spezifikation
fiorix
Zur Verdeutlichung kann eine 32-Bit-Ganzzahl nach der Codierung durch Varint bis zu 5 Byte verwenden.
Fiorix
3
Dies funktioniert nicht für den Anwendungsfall des OP. Verwenden Sie binary.Read()stattdessen. Siehe: codereview.stackexchange.com/questions/15945/...
IanB
10

Wenn [] Byte ASCII-Byte-Nummern sind, konvertieren Sie zuerst das [] Byte in einen String und verwenden Sie die strconvPaketmethode Atoi, die den String in int konvertiert.

package main
import (
    "fmt"
    "strconv"
)

func main() {
    byteNumber := []byte("14")
    byteToInt, _ := strconv.Atoi(string(byteNumber))
    fmt.Println(byteToInt)
}

Spielplatz - https://play.golang.org/p/gEzxva8-BGP

Tinkaal Gogoi
quelle
6

Zum Codieren / Decodieren von Zahlen zu / von Bytesequenzen gibt es das Codierungs- / Binärpaket . In der Dokumentation finden Sie Beispiele: Siehe Abschnitt Beispiele im Inhaltsverzeichnis.

Diese Codierungsfunktionen arbeiten auf io.Writer- Schnittstellen. Der Typ net.TCPConn implementiert io.Writer, sodass Sie direkt in Netzwerkverbindungen schreiben / lesen können.

Wenn Sie auf beiden Seiten der Verbindung ein Go-Programm haben, sollten Sie sich die Verwendung von encoding / gob ansehen . Im Artikel " Gobs of Data " finden Sie eine exemplarische Vorgehensweise zur Verwendung von Gobs (springen Sie nach unten, um ein eigenständiges Beispiel anzuzeigen ).

axw
quelle
Können Sie ein Beispiel für die Verwendung von gob in einer TCP-Anwendung geben?
Emanuel
Ich habe einen Link zu einem Artikel hinzugefügt, der Gobs beschreibt. Sie können nach unten springen, wenn Sie nur ein Codebeispiel sehen möchten. Wenn Sie einen Encoder / Decoder erstellen, können Sie einfach das *TCPConnals Argument an gob.NewEncoder/ übergeben gob.NewDecoder.
Axw
1
now := []byte{0xFF,0xFF,0xFF,0xFF}
nowBuffer := bytes.NewReader(now)
var  nowVar uint32
binary.Read(nowBuffer,binary.BigEndian,&nowVar)
fmt.Println(nowVar)
4294967295
Inasa Xia
quelle
-10
var bs []byte
value, _ := strconv.ParseInt(string(bs), 10, 64)
elhussein
quelle
Es hat vermutlich eine Menge Stimmen verloren, da es keine Erklärung gibt und es eher int64 als int zurückgibt. Wenn Sie int64 (ich) wollten, wäre dies eine gültige Methode? Die Konvertierung von Zeichenfolgen scheint eine Redundanz zu sein.
Robstarbuck
1
Diese Antwort macht nicht das, was der Asker beabsichtigt hat. Dies liest eine Folge von Bytes, interpretiert sie als Zeichen und prüft, ob diese Zeichen eine Zahl enthalten. Der höchste Wert, der von 4 Bytes zurückgegeben werden kann, ist '9999'. Der Asker hatte 4 Bytes in einem Slice, die in Kombination eine 4-Byte-Ganzzahl darstellen, und wollte wissen, wie die Ganzzahl darin am einfachsten extrahiert werden kann. Dies könnte Ergebnisse zwischen -2 ^ 31 bis 2 ^ 31-1 zurückgeben.
fwip