Go语言编程中[]byte到int的转换

h7appiyu  于 2022-12-20  发布在  Go
关注(0)|答案(9)|浏览(263)

我需要创建一个基于TCP的客户端-服务器示例。在客户端读取2个数字并将其发送到服务器。我面临的问题是无法从[]byte转换为int,因为通信只接受[]byte类型的数据。
是否有任何方法可以将[]byte转换为int,或者可以将int发送到服务器?
一些示例代码将非常感谢。
谢谢。

mcdcgff0

mcdcgff01#

对于将数字编码到字节序列或从字节序列解码数字,有encoding/binary包,文档中有示例:参见目录中的示例部分。
这些编码函数在io.Writer接口上操作。net.TCPConn类型实现了io.Writer,因此您可以直接对网络连接进行读写。
如果你在连接的两端都有Go语言程序,你可能会想看看encoding/gob的用法,参见文章“Gobs of data“,了解gob的用法(跳到底部,看一个独立的例子)。

t8e9dugd

t8e9dugd2#

使用不带附加依赖项的位运算符

func toInt(bytes []byte) int {
    result := 0
    for i := 0; i < 4; i++ {
        result = result << 8
        result += int(bytes[i])

    }

    return result
}
wgxvkvu9

wgxvkvu93#

encoding/binary中的binary.Read提供了将字节数组转换为数据类型的机制。
请注意,网络字节顺序是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

sczxawaw

sczxawaw4#

如果[]byte数组中的字节是从0到9的ASCII字符,则可以在循环中将它们转换为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)

Go Playground

wvmv3b1j

wvmv3b1j5#

您可以使用encoding/binary的ByteOrder为16、32、64位类型执行此操作
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)
}
s8vozzvw

s8vozzvw6#

如果[]byte是ASCII字节数,则首先将[]byte转换为string,然后使用strconvAtoi方法将string转换为int。

package main
import (
    "fmt"
    "strconv"
)

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

Go playground

t9eec4r0

t9eec4r07#

从字节数组开始,您可以使用binary package来执行转换。
例如,如果要读取int:

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

同一个包允许使用通用的Read函数,按照所需的字节顺序阅读unsigned int或float。

k7fdbhmy

k7fdbhmy8#

now := []byte{0xFF,0xFF,0xFF,0xFF}
nowBuffer := bytes.NewReader(now)
var  nowVar uint32
binary.Read(nowBuffer,binary.BigEndian,&nowVar)
fmt.Println(nowVar)
4294967295
ev7lccsx

ev7lccsx9#

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

相关问题