|
- package ec
-
- import (
- "github.com/klauspost/reedsolomon"
- )
-
- type Rs struct {
- encoder reedsolomon.Encoder
- ecN int
- ecK int
- ecP int
- }
-
- func NewRs(k int, n int) (*Rs, error) {
- enc := Rs{
- ecN: n,
- ecK: k,
- ecP: n - k,
- }
- encoder, err := reedsolomon.New(k, n-k)
- enc.encoder = encoder
- return &enc, err
- }
-
- // 任意k个块恢复出所有原始的数据块。
- // blocks的长度必须为N,且至少有K个元素不为nil
- func (r *Rs) ReconstructData(blocks [][]byte) error {
- outIndexes := make([]int, r.ecK)
- for i := 0; i < r.ecK; i++ {
- outIndexes[i] = i
- }
-
- return r.ReconstructAny(blocks, outIndexes)
- }
-
- // 重建指定的任意块,可以是数据块或校验块。
- // 在input上原地重建,因此input的长度必须为N。
- func (r *Rs) ReconstructAny(blocks [][]byte, outBlockIdxes []int) error {
- required := make([]bool, len(blocks))
- for _, idx := range outBlockIdxes {
- required[idx] = true
- }
- return r.encoder.ReconstructAny(blocks, required)
- }
-
- func (r *Rs) GenerateMatrix(inputIdxs []int, outputIdxs []int) ([][]byte, error) {
- return r.encoder.(reedsolomon.Extensions).GenerateMatrix(inputIdxs, outputIdxs)
- }
|