1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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
- }
- }
|