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

bytes パッケージとそこにある Buffer タイプを見てください。int をバイトとしてバッファに書き込んでから、Bytes() メソッドを使用してバッファのバイト スライスにアクセスできます。

于 2010-01-29T15:24:36.160 に答える
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 に答える
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 に答える