С помощью Go, как добавить неизвестное число байтов в вектор и получить часть байтов? - PullRequest
2 голосов
/ 29 января 2010

Я пытаюсь закодировать большое число в список байтов (uint8 в Go). Количество байтов неизвестно, поэтому я бы хотел использовать вектор. Но Go не предоставляет вектор байта, что я могу сделать? И возможно ли получить кусочек такого байтового вектора?

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

Мой код не может быть скомпилирован, неверное утверждение типа:

  1 package main
  2 
  3 import (
  4     //"fmt"
  5     "container/vector"
  6 )
  7 
  8 func vbEncodeNumber(n uint) []byte{
  9     bytes := new(vector.Vector)
 10     for {
 11         bytes.Push(n % 128)
 12         if n < 128 {
 13             break
 14         }
 15         n /= 128
 16     }
 17     bytes.Set(bytes.Len()-1, bytes.Last().(byte)+byte(128))
 18     return bytes.Data().([]byte) // <-
 19 }
 20 
 21 func main() { vbEncodeNumber(10000) }

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

Я не нашел пример кода для вектора.

Ответы [ 3 ]

2 голосов
/ 29 января 2010

Посмотрите на пакет байтов и тип буфера там. Вы можете записать свои байты в виде байтов в буфер, а затем вы можете использовать метод Bytes () для доступа к байтовым фрагментам буфера.

2 голосов
/ 29 января 2010

Поскольку вы пытаетесь представлять большие числа, вы можете посмотреть, соответствует ли большой пакет вашим целям.

Общая структура Vector может использоваться для хранения байтов. Он принимает пустой интерфейс в качестве своего типа, и любой другой тип удовлетворяет этому интерфейсу. Вы можете получить фрагмент интерфейса с помощью метода Data, но нет способа преобразовать его в фрагмент байта, не копируя его. Вы не можете использовать утверждение типа, чтобы превратить часть интерфейса {} в часть чего-то еще. В конце вашей функции вам нужно будет сделать что-то вроде следующего: (Я не пытался скомпилировать этот код, потому что сейчас не могу)

byteSlice = make([]byte, bytes.Len())
for i, _ := range byteSlice {
    byteSlice[i] = bytes.At(i).(byte)
}
return byteSlice
1 голос
/ 26 мая 2011

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

package main

import "fmt"

func vbEncodeNumber(n uint) []byte {
    bytes := make([]byte, 0, 4)
    for n > 0 {
        bytes = append(bytes, byte(n%256))
        n >>= 8
    }
    return bytes
}

func main() {
    bytes := vbEncodeNumber(10000)
    for i := len(bytes)-1; i >= 0 ; i-- {
        fmt.Printf("%02x ", bytes[i])
    }
    fmt.Println("")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...