我需要创建一个TCP的客户端-服务器示例。在客户端,我读取两个数字并将它们发送到服务器。我遇到的问题是,我无法将[]byte
转换为int
,因为通信只接受[]byte
类型的数据。
有没有办法将[]byte
转换为int
,或者我可以将int
发送到服务器?
非常感谢提供一些示例代码。
谢谢。
我需要创建一个TCP的客户端-服务器示例。在客户端,我读取两个数字并将它们发送到服务器。我遇到的问题是,我无法将[]byte
转换为int
,因为通信只接受[]byte
类型的数据。
有没有办法将[]byte
转换为int
,或者我可以将int
发送到服务器?
非常感谢提供一些示例代码。
谢谢。
Uint64
方法在源代码的这一行失败了:_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
,因为显然索引超出了范围。我需要使用Uint16
方法。 - ThePartyTurtle如果 []byte 是 ASCII 字节数字,则首先将 []byte 转换为字符串,然后使用 strconv
包中的 Atoi
方法将字符串转换为整数。
package main
import (
"fmt"
"strconv"
)
func main() {
byteNumber := []byte("14")
byteToInt, _ := strconv.Atoi(string(byteNumber))
fmt.Println(byteToInt)
}
binary.Read()
。参考:http://codereview.stackexchange.com/questions/15945/effectively-convert-little-endian-byte-slice-to-int32 - IanBnow := []byte{0xFF,0xFF,0xFF,0xFF}
nowBuffer := bytes.NewReader(now)
var nowVar uint32
binary.Read(nowBuffer,binary.BigEndian,&nowVar)
fmt.Println(nowVar)
4294967295
math/big
提供了将二进制切片转换为数字的简单易用的方法。playground
package main
import (
"fmt"
"math/big"
)
func main() {
b := []byte{0x01, 0x00, 0x01}
v := int(big.NewInt(0).SetBytes(b).Uint64())
fmt.Printf("%v", v)
}
要对数字进行字节序列的编码/解码,可以使用encoding/binary包。在文档中有示例:请查看目录中的示例部分。
这些编码函数操作io.Writer接口。net.TCPConn类型实现了io.Writer,因此您可以直接写入/读取网络连接。
如果您的Go程序在连接的两端,您可能需要考虑使用encoding/gob。请参阅文章"Gobs of data",了解使用gob的演练(跳到底部以查看自包含示例)。
*TCPConn
作为参数传递给gob.NewEncoder
/ gob.NewDecoder
即可。 - axw使用位运算符而不需要额外依赖
func toInt(bytes []byte) int {
result := 0
for i := 0; i < 4; i++ {
result = result << 8
result += int(bytes[i])
}
return result
}
[]byte
数组中的字节是 ASCII 字符 0 到 9,您可以在循环中将它们转换为 int
:var value int
for _, b := range []byte{48, 49, 50, 51, 52} {
value = value*10 + int(b-48)
}
fmt.Printf("integer value: %d", value)
{{链接1:Go Playground}}
binary.Read
在 encoding/binary
中提供了将字节数组转换为数据类型的机制。
请注意,网络字节顺序是BigEndian,所以在这种情况下,您需要指定binary.BigEndian
。
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
var myInt int
b := []byte{0x18, 0x2d} // This could also be a stream
buf := bytes.NewReader(b)
err := binary.Read(buf, binary.BigEndian, &myInt) // Make sure you know if the data is LittleEndian or BigEndian
if err != nil {
fmt.Println("binary.Read failed:", err)
return
}
fmt.Print(myInt)
}
阅读此文档可能会有所帮助:https://pkg.go.dev/encoding/binary@go1.17.1#Read