2012-06-25 34 views
35

Ho bisogno di creare un esempio client-server su TCP. Nella parte client leggo 2 numeri e li mando al server. Il problema che ho dovuto affrontare è che non riesco a convertire da []byte a int, perché la comunicazione accetta solo i dati di tipo []byte.Come convertire da [] byte a int in Programmazione Go

C'è un modo per convertire []byte in int o posso inviare int al server?

Alcuni codici di esempio saranno molto apprezzati.

Grazie.

+0

Giusto per chiarire il compito, stai scrivendo sia il codice client che il codice server? E sono entrambi scritti in Go? – Sonia

+0

AFAIK devi fare il cambio di bit. – fiorix

+0

Per inviare dati alla rete deve essere in forma di byte. – IanB

risposta

9

A partire da un array di byte è possibile utilizzare lo binary package per eseguire le conversioni.

Per esempio, se si desidera leggere interi:

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

Lo stesso pacchetto permette la lettura di unsigned int o galleggianti, con gli ordini di byte desiderati, utilizzando la funzione generale Read.

+8

Varint è specifico per i buffer di protocollo e probabilmente non è quello che stai cercando. Spec: http://code.google.com/apis/protocolbuffers/docs/encoding.html – fiorix

+0

Giusto per chiarire, un numero intero a 32 bit può utilizzare fino a 5 byte dopo la codifica di Varint. – fiorix

+2

Questo non funziona per il caso d'uso dell'OP. Usa invece 'binary.Read()'. Vedi: http://codereview.stackexchange.com/questions/15945/effectively-convert-little-endian-byte-slice-to-int32 – IanB

6

Per i numeri di codifica/decodifica in/da sequenze di byte, c'è il pacchetto encoding/binary. Ci sono degli esempi nella documentazione: vedi la sezione degli esempi nel sommario.

Queste funzioni di codifica funzionano sulle interfacce io.Writer. Il tipo net.TCPConn implementa io.Writer, quindi è possibile scrivere/leggere direttamente sulle connessioni di rete.

Se si dispone di un programma Go su entrambi i lati della connessione, è possibile utilizzare encoding/gob. Vedere l'articolo "Gobs of data" per una procedura dettagliata sull'utilizzo di gob (saltare in basso per vedere un esempio autonomo).

+0

Puoi dare un esempio di come usare gob in un'applicazione TCP? – Emanuel

+0

Ho aggiunto un collegamento a un articolo che descrive le gocce; puoi saltare in fondo se vuoi solo vedere un esempio di codice. Quando costruisci un codificatore/decodificatore, puoi passare il '* TCPConn' come argomento a' gob.NewEncoder'/'gob.NewDecoder'. – axw

35

(reinserire this answer)

È possibile utilizzare la codifica/di binario ByteOrder di fare questo per 16, 32, i tipi a 64 bit

Play

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

Come su offset? – majidarif

+0

cosa intendi con offset? come in, lettura dal centro di un [] byte? fai semplicemente BigEndian.Uint64 (bigSlice [10:18]) (in pratica, leggi i byte nel mezzo della sezione o intendi qualcos'altro? –

+1

Ya, ho pensato dopo aver fatto la domanda stupida. Non riesco a modificarlo: D Grazie però. – majidarif

-7
var bs []byte 
value, _ := strconv.ParseInt(string(bs), 10, 64) 
+0

Ci sono voluti molti voti in basso, presumibilmente perché non ci sono spiegazioni e restituisce int64 piuttosto che int. Se volessi int64 (lo faccio) questo sarebbe un metodo valido? La conversione delle stringhe sembra una ridondanza. – robstarbuck

+0

Questa soluzione funziona per la conversione di '[] byte' in' int64' (che è quello che mi serve), quindi qualcuno può sperimentare in gange golan e dire se questo è OK o se c'è un modo migliore? Grazie. –