我正在尝试将大数字编码为字节列表(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上找到代码示例。
答案 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("")
}