使用Go,如何将未知数量的字节附加到向量中并获得一片字节?

时间:2010-01-29 03:58:00

标签: go

我正在尝试将大数字编码为字节列表(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可以返回字节数组。

我没有在vector上找到代码示例。

3 个答案:

答案 0 :(得分:2)

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

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

byteSlice = make([]byte, bytes.Len())
for i, _ := range byteSlice {
    byteSlice[i] = bytes.At(i).(byte)
}
return byteSlice

答案 1 :(得分:2)

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

答案 2 :(得分: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("")
}