将整数转换为字节数组

新手上路,请多包涵

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

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

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

原文由 vascop 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 657
2 个回答

我同意 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)
}

原文由 dyoo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题