首页 > 文章列表 > 将整数转换为字节数组

将整数转换为字节数组

golang
498 2023-03-08

问题内容

我有一个接收 a 的函数,[]byte但我拥有的是一个int,进行这种转换的最佳方法是什么?

err = a.Write([]byte(myInt))

我想我可以走很长的路,把它变成一个字符串,然后把它变成字节,但这听起来很难看,我想有更好的方法来做到这一点。

正确答案

我同意 Brainstorm 的方法:假设您传递的是机器友好的二进制表示,请使用该encoding/binary库。OP 建议这binary.Write()可能会有一些开销。查看实现的源代码Write(),我发现它做了一些运行时决策以获得最大的灵活性。

func Write(w io.Writer, order ByteOrder, data interface{}) error {
    // Fast path for basic types.
    var b [8]byte
    var bs []byte
    switch v := data.(type) {
    case *int8:
        bs = b[:1]
        b[0] = byte(*v)
    case int8:
        bs = b[:1]
        b[0] = byte(v)
    case *uint8:
        bs = b[:1]
        b[0] = *v
    ...

正确的?Write() 接受了一个非常通用的data第三个参数,这会增加一些开销,因为 Go 运行时会被迫对类型信息进行编码。由于Write()在这里做一些你在你的情况下根本不需要的运行时决策,也许你可以直接调用编码函数,看看它是否表现更好。

像这样的东西:

package main

import (
    "encoding/binary"
    "fmt"
)

func main() {
    bs := make([]byte, 4)
    binary.LittleEndian.PutUint32(bs, 31415926)
    fmt.Println(bs)
}

让我们知道这是如何执行的。

否则,如果您只是想获取整数的 ASCII 表示,则可以获取字符串表示(可能使用strconv.Itoa)并将该字符串转换为[]byte类型。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    bs := []byte(strconv.Itoa(31415926))
    fmt.Println(bs)
}