2

我正在尝试将大量数字编码为字节列表(Go 中的 uint8)。字节数未知,所以我想使用vector。但是 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 可以返回字节数组。

我还没有找到有关矢量的代码示例。

4

3 回答 3

2

由于您试图表示大数字,您可能会看到大包是否符合您的目的。

通用 Vector 结构可用于存储字节。它接受一个空接口作为其类型,并且任何其他类型都满足该接口。您可以通过 Data 方法检索接口切片,但是如果不复制它,就无法将其转换为字节切片。您不能使用类型断言将一部分 interface{} 转换为另一部分。您必须在函数末尾执行以下操作:(我没有尝试编译此代码,因为我现在不能)

byteSlice = make([]byte, bytes.Len())
for i, _ := range byteSlice {
    byteSlice[i] = bytes.At(i).(byte)
}
return byteSlice
于 2010-01-29T04:55:28.290 回答
2

看看 bytes 包和那里的 Buffer 类型。您可以将整数作为字节写入缓冲区,然后可以使用 Bytes() 方法访问缓冲区的字节片。

于 2010-01-29T15:24:36.160 回答
1

我发现向量的用处要小得多,因为通用附加和复制已添加到语言中。以下是我如何在一次拍摄中减少复制:

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("")
}
于 2011-05-26T15:36:16.117 回答