2012-06-25 17 views
35

Tôi cần tạo ví dụ máy khách-máy chủ qua TCP. Ở phía máy khách, tôi đọc 2 số và gửi chúng đến máy chủ. Vấn đề tôi phải đối mặt là tôi không thể chuyển đổi từ []byte thành int, bởi vì giao tiếp chỉ chấp nhận dữ liệu loại []byte.Cách chuyển đổi từ [] byte sang int trong Lập trình

Có cách nào để chuyển đổi []byte thành int hoặc tôi có thể gửi int tới máy chủ không?

Một số mã mẫu sẽ thực sự được đánh giá cao.

Cảm ơn.

+0

64 chút Chỉ cần làm rõ nhiệm vụ, bạn có đang viết cả mã máy khách và mã máy chủ không? Và cả hai đều được viết bằng Go? – Sonia

+0

AFAIK bạn phải làm bit shift. – fiorix

+0

Để gửi dữ liệu đến mạng, nó cần phải ở dạng byte. – IanB

Trả lời

9

Bắt đầu từ mảng byte, bạn có thể sử dụng binary package để thực hiện chuyển đổi.

Ví dụ, nếu bạn muốn đọc ints:

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

Các gói phần mềm tương tự cho phép người đọc unsigned int hoặc phao nổi, với lệnh byte mong muốn, bằng cách sử dụng chung Read chức năng.

+8

Varint là dành riêng cho bộ đệm giao thức và có lẽ không phải là những gì bạn đang tìm kiếm. Spec: http://code.google.com/apis/protocolbuffers/docs/encoding.html – fiorix

+0

Chỉ cần làm rõ, một số nguyên 32 bit có thể sử dụng tối đa 5 byte sau khi được mã hóa bởi Varint. – fiorix

+2

Điều này không hoạt động đối với trường hợp sử dụng của OP. Sử dụng 'binary.Read()' để thay thế. Xem: http://codereview.stackexchange.com/questions/15945/effectively-convert-little-endian-byte-slice-to-int32 – IanB

6

Để mã hóa/giải mã số thành/từ chuỗi byte, có gói encoding/binary. Có các ví dụ trong tài liệu: xem phần Ví dụ trong mục lục.

Các chức năng mã hóa này hoạt động trên các giao diện io.Writer. Loại net.TCPConn thực hiện io.Writer, vì vậy bạn có thể ghi/đọc trực tiếp các kết nối mạng.

Nếu bạn có chương trình Go ở hai bên của kết nối, bạn có thể muốn xem bằng cách sử dụng encoding/gob. Xem bài viết "Gobs of data" để biết hướng dẫn sử dụng gob (bỏ qua phía dưới để xem ví dụ độc lập).

+0

Bạn có thể cho ví dụ về cách sử dụng gob trong ứng dụng TCP không? – Emanuel

+0

Tôi đã thêm một liên kết vào một bài viết mô tả gobs; bạn có thể bỏ qua phía dưới nếu bạn chỉ muốn xem ví dụ về mã. Khi bạn xây dựng bộ mã hóa/bộ giải mã, bạn chỉ có thể chuyển trong '* TCPConn' làm đối số cho' gob.NewEncoder'/'gob.NewDecoder'. – axw

35

(reposting this answer)

Bạn có thể sử dụng ByteOrder mã hóa/nhị phân để thực hiện điều này trong vòng 16, 32, các loại

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

Làm thế nào về offsets? – majidarif

+0

ý của bạn là gì? như trong, đọc từ giữa một byte []? chỉ cần làm BigEndian.Uint64 (bigSlice [10:18]) (về cơ bản, đọc các byte ở giữa slice. Hay bạn có ý gì đó khác? –

+1

Ya, tôi đã tìm ra sau khi hỏi câu hỏi ngu ngốc. Chỉ cần không thể chỉnh sửa nó: D Cảm ơn mặc dù. – majidarif

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

Nó lấy rất nhiều phiếu giảm giá này có lẽ là không có lời giải thích và nó trả về int64 chứ không phải là int. Nếu bạn muốn int64 (tôi làm) đây sẽ là một phương pháp hợp lệ? Để chuyển đổi chuỗi có vẻ như một sự thừa. – robstarbuck

+0

Giải pháp này hoạt động để chuyển đổi '[] byte' thành' int64' (đó là những gì tôi cần), vì vậy ai đó có kinh nghiệm trong golang kêu vang và nói nếu điều này là OK hoặc nếu có một cách tốt hơn? Cảm ơn. –