62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
package aztec
|
|
|
|
import (
|
|
"github.com/boombuler/barcode/utils"
|
|
)
|
|
|
|
func bitsToWords(stuffedBits *utils.BitList, wordSize int, wordCount int) []int {
|
|
message := make([]int, wordCount)
|
|
|
|
for i := 0; i < wordCount; i++ {
|
|
value := 0
|
|
for j := 0; j < wordSize; j++ {
|
|
if stuffedBits.GetBit(i*wordSize + j) {
|
|
value |= (1 << uint(wordSize-j-1))
|
|
}
|
|
}
|
|
message[i] = value
|
|
}
|
|
return message
|
|
}
|
|
|
|
func generateCheckWords(bits *utils.BitList, totalBits, wordSize int) *utils.BitList {
|
|
rs := utils.NewReedSolomonEncoder(getGF(wordSize))
|
|
|
|
// bits is guaranteed to be a multiple of the wordSize, so no padding needed
|
|
messageWordCount := bits.Len() / wordSize
|
|
totalWordCount := totalBits / wordSize
|
|
eccWordCount := totalWordCount - messageWordCount
|
|
|
|
messageWords := bitsToWords(bits, wordSize, messageWordCount)
|
|
eccWords := rs.Encode(messageWords, eccWordCount)
|
|
startPad := totalBits % wordSize
|
|
|
|
messageBits := new(utils.BitList)
|
|
messageBits.AddBits(0, byte(startPad))
|
|
|
|
for _, messageWord := range messageWords {
|
|
messageBits.AddBits(messageWord, byte(wordSize))
|
|
}
|
|
for _, eccWord := range eccWords {
|
|
messageBits.AddBits(eccWord, byte(wordSize))
|
|
}
|
|
return messageBits
|
|
}
|
|
|
|
func getGF(wordSize int) *utils.GaloisField {
|
|
switch wordSize {
|
|
case 4:
|
|
return utils.NewGaloisField(0x13, 16, 1)
|
|
case 6:
|
|
return utils.NewGaloisField(0x43, 64, 1)
|
|
case 8:
|
|
return utils.NewGaloisField(0x012D, 256, 1)
|
|
case 10:
|
|
return utils.NewGaloisField(0x409, 1024, 1)
|
|
case 12:
|
|
return utils.NewGaloisField(0x1069, 4096, 1)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|