Go编程中如何从[] byte转换为int


74

我需要通过TCP创建一个客户端-服务器示例。在客户端,我读取了2个数字,然后将它们发送到服务器。我面临的问题是我无法从转换[]byteint,因为通信仅接受type的数据[]byte

有什么方法可以转换[]byteint或可以发送int到服务器吗?

一些示例代码将不胜感激。

谢谢。


只是为了澄清任务,您是否同时编写了客户端和服务器代码?而且都是用Go编写的吗?
索尼娅2012年

AFAIK,您必须进行移位。
fiorix

要将数据发送到网络,它必须为字节形式。
IanB 2014年

Answers:


83

(转发此答案

您可以使用编码/二进制的ByteOrder对位类型执行此操作

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

4
偏移量是什么意思?如从[]字节的中间读取?只是做BigEndian.Uint64(bigSlice [10:18])(基本上是读取切片中间的字节。或者您是说其他意思吗?)
David Budworth

2
是的,我问了这个愚蠢的问题后才想到。只是无法编辑它:D不过,谢谢。
majidarif

4
它返回uint16,uint32,unit64,但不返回int。需要从uint转换为int
Tinkaal Gogoi

显而易见,但是刚开始时只想将byte []转换为int:这在字节数组非常小的情况下不起作用。对于我的一种情况,我有一个仅包含2个元素的字节数组,并且该Uint64方法在source的这一行失败_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808,因为显然索引超出范围。我需要这种Uint16方法。
ThePartyTurtle

@TinkalGogoi使用int64(value)将值转换为int64。
比尔·伯迪克

11

从字节数组开始,您可以使用二进制包进行转换。

例如,如果您想读取ints:

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

相同的包允许使用常规的Read函数以所需的字节顺序读取无符号的int或float 。


11
Varint特定于协议缓冲区,可能不是您想要的。规范:code.google.com/apis/protocolbuffers/docs/encoding.html
fiorix 2013年

需要说明的是,由Varint编码后,一个32位整数可能最多使用5个字节。
fiorix

3
这对于OP的用例不起作用。使用binary.Read()代替。请参阅:codereview.stackexchange.com/questions/15945/...
IANB

10

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

package main
import (
    "fmt"
    "strconv"
)

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

去操场-https: //play.golang.org/p/gEzxva8-BGP


将一个int解析为一个字符串,然后解析为一个字节数组,然后反转似乎太长了
Martin Nowosad

是的,从字节到int的开销较小,但是还没有找到解决方法。
Tinkaal Gogoi

6

为了在字节序列之间对数字进行编码/解码,有一个编码/二进制包。文档中有示例:请参阅目录中的“示例”部分。

这些编码功能在io.Writer接口上运行。该net.TCPConn式工具io.Writer,所以你可以写/直接读取到的网络连接。

如果连接的任一端都有Go程序,则可能需要使用encoding / gob。有关使用gob的演练,请参阅文章“数据的gob”(跳至底部以查看独立的示例)。


您能否举一个在TCP应用程序中如何使用gob的示例?
伊曼纽尔(Emanuel)2012年

我添加了一个链接,该链接描述了采空区;如果您只想查看代码示例,则可以跳到底部。构造编码器/解码器时,只需将/*TCPConn作为参数传递给gob.NewEncoder/ gob.NewDecoder
axw 2012年

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

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

据推测,由于没有任何解释,它被否决了很多票,并且它返回int64而不是int。如果您想要int64(我愿意),这将是有效的方法吗?字符串转换似乎是多余的。
robstarbuck '16

1
这个答案并没有达到Asker的意图。这将读取一个字节序列,将其解释为字符,然后查看这些字符是否包含数字。可以从4个字节返回的最大值是'9999'。Asker在一个片中有4个字节,当组合在一起时,代表4个字节的整数,并且想知道在其中提取整数的最简单方法。这可能会返回-2 ^ 31到2 ^ 31-1之间的结果。
fwip
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.