Подтвердить что ты не робот

Преобразование целого в массив байтов

У меня есть функция, которая получает []byte, но у меня есть int, что лучший способ сделать это преобразование?

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

Я думаю, я мог бы пройти долгий путь и получить его в строку и поместить в байты, но это звучит уродливо, и я думаю, что есть лучшие способы сделать это.

4b9b3361

Ответ 1

Я согласен с подходом 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
   ...

Правильно? 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) и произнести это string в тип []byte.

package main

import (
    "fmt"
    "strconv"
)

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

Ответ 3

Извините, это может быть немного поздно. Но я думаю, что нашел лучшую реализацию в 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())

Ответ 4

Что плохого в преобразовании его в строку?

[]byte(fmt.Sprintf("%d", myint))