簡體   English   中英

在go中通過套接字發送int64的正確方法

[英]Proper way to send an int64 over a socket in go

我正在嘗試在golang中通過TCP發送一個int64,但是,我的接收器打印得到的數字與我發送的不同。 完成此任務的正確方法是什么?

//Buffer on both client and server
buffer := make([]byte, 1024)

//Sender
fileInfo, error := os.Stat(fileName)
if error != nil {
    fmt.Println("Error opening file")
}
var fSize int = int(fileInfo.Size())

connection.Write([]byte(string(fSize)))


//Receiver
connection.Read(buffer)

fileSize := new(big.Int).SetBytes(bytes.Trim(buffer, "\x00")).Int64()
if err != nil {
    fmt.Println("not a valid filesize")
    fileSize = 0
}

使用binary.Write / binary.Read

//sender
err := binary.Write(connection, binary.LittleEndian, fileInfo.Size())
if err != nil {
    fmt.Println("err:", err)
}

//receiver
var size int64
err := binary.Read(connection, binary.LittleEndian, &size)
if err != nil {
    fmt.Println("err:", err)
}

[]byte(string(fSize))沒有做你認為它做的事情,它將數字視為unicode字符,它不返回它的字符串表示。

如果你想要一個數字的字符串表示,使用strconv.Itoa ,如果你想要二進制表示,那么使用:

num := make([]byte, 8) // or 4 for int32 or 2 for int16
binary.LittleEndian.PutUint64(num, 1<<64-1) 

使用binary.BigEndianbinary.LittleEndian來編碼整數:

  var size int64

  // Send

  var buf [8]byte
  binary.BigEndian.PutUint64(buf[:], uint64(size))
  _, err := w.Write(buf[:])

  // Receive

  var buf [8]byte
  _, err := io.ReadFull(r, buf[:])
  if err != nil {
      // handle error
  }
  size = int64(binary.BigEndian.Uint64(buf[:])

您還可以使用binary.Readbinary.Write 您的應用程序代碼將以類型開關和這些功能中的其他粘貼為代價稍微縮短一些。

關於問題中代碼的幾點。 轉換

 string(fSize)

返回符文fSize的UTF-8表示。 它不返回十進制編碼或二進制編碼值。 使用strconv packate將數值轉換為十進制表示。 使用上面提到的二進制包轉換為二進制表示。

序列

connection.Read(buffer)
buffer = bytes.Trim(buffer, "\x00")

如果數據恰好在末尾包含0字節,則會刪除實際數據。 Read返回讀取的字節數。 使用該長度來切片緩沖區:

n, err := connection.Read(buffer)
buffer = buffer[:n]

你不能使用string()從int轉換,你需要使用strconv包。

connection.Write([]byte(strconv.FormatInt(fileInfo.Size(), 10))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM