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  }