将整数转换为字节数组

vas*_*cop 42 type-conversion go

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

err = a.Write([]byte(myInt))
Run Code Online (Sandbox Code Playgroud)

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

dyo*_*yoo 48

我同意Brainstorm的方法:假设您传递的是机器友好的二进制表示,请使用该encoding/binary库.OP表明binary.Write()可能会有一些开销.纵观的实施Write(),我看到它做了一些运行时的决策最大的灵活性.

   189  func Write(w io.Writer, order ByteOrder, data interface{}) error {
   190      // Fast path for basic types.
   191      var b [8]byte
   192      var bs []byte
   193      switch v := data.(type) {
   194      case *int8:
   195          bs = b[:1]
   196          b[0] = byte(*v)
   197      case int8:
   198          bs = b[:1]
   199          b[0] = byte(v)
   200      case *uint8:
   201          bs = b[:1]
   202          b[0] = *v
   ...
Run Code Online (Sandbox Code Playgroud)

对?Write()接受一个非常通用的data第三个参数,并且随着Go运行时强制进入编码类型信息,这会产生一些开销.由于Write()您在这里做了一些运行时决策,在您的情况下根本不需要,也许您可​​以直接调用编码函数并查看它是否表现更好.

像这样的东西:

package main

import (
    "encoding/binary"
    "fmt"
)

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

让我们知道这是如何表现的.

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

package main

import (
    "fmt"
    "strconv"
)

func main() {
    bs := []byte(strconv.Itoa(31415926))
    fmt.Println(bs)
}
Run Code Online (Sandbox Code Playgroud)


Bra*_*orm 25

查看"编码/二进制"包.特别是读写功能:

binary.Write(a, binary.LittleEndian, myInt)
Run Code Online (Sandbox Code Playgroud)

  • 在对"enconding/binary"方式进行基准测试后,它比int - > string - > byte需要差不多4倍 (6认同)
  • 但是你的消费者对整数有什么字节表示?当然不是ASCII表示?请澄清. (4认同)
  • 确保检查`binary.Write` 返回的错误,请参阅@Agniva De Sarker 的回答。不能直接使用 `int` 类型,你需要将它转换为 `int64` 或类似的东西。 (2认同)

Agn*_*ker 10

对不起,这可能有点晚了.但我认为我在go docs上找到了更好的实现.

buf := new(bytes.Buffer)
var num uint16 = 1234
err := binary.Write(buf, binary.LittleEndian, num)
if err != nil {
    fmt.Println("binary.Write failed:", err)
}
fmt.Printf("% x", buf.Bytes())
Run Code Online (Sandbox Code Playgroud)