git.sr.ht/~pingoo/stdx@v0.0.0-20240218134121-094174641f6e/barcode/datamatrix/errorcorrection.go (about) 1 package datamatrix 2 3 import ( 4 "git.sr.ht/~pingoo/stdx/barcode/utils" 5 ) 6 7 type errorCorrection struct { 8 rs *utils.ReedSolomonEncoder 9 } 10 11 var ec *errorCorrection = newErrorCorrection() 12 13 func newErrorCorrection() *errorCorrection { 14 gf := utils.NewGaloisField(301, 256, 1) 15 16 return &errorCorrection{utils.NewReedSolomonEncoder(gf)} 17 } 18 19 func (ec *errorCorrection) calcECC(data []byte, size *dmCodeSize) []byte { 20 dataSize := len(data) 21 // make some space for error correction codes 22 data = append(data, make([]byte, size.ECCCount)...) 23 24 for block := 0; block < size.BlockCount; block++ { 25 dataCnt := size.DataCodewordsForBlock(block) 26 27 buff := make([]int, dataCnt) 28 // copy the data for the current block to buff 29 j := 0 30 for i := block; i < dataSize; i += size.BlockCount { 31 buff[j] = int(data[i]) 32 j++ 33 } 34 // calc the error correction codes 35 ecc := ec.rs.Encode(buff, size.ErrorCorrectionCodewordsPerBlock()) 36 // and append them to the result 37 j = 0 38 for i := block; i < size.ErrorCorrectionCodewordsPerBlock()*size.BlockCount; i += size.BlockCount { 39 data[dataSize+i] = byte(ecc[j]) 40 j++ 41 } 42 } 43 44 return data 45 }