77 lines
1.3 KiB
Go
77 lines
1.3 KiB
Go
package pdf417
|
|
|
|
import (
|
|
"errors"
|
|
"math/big"
|
|
|
|
"github.com/boombuler/barcode/utils"
|
|
)
|
|
|
|
type numberEncoder struct{}
|
|
|
|
func newNumberEncoder() *numberEncoder {
|
|
return new(numberEncoder)
|
|
}
|
|
|
|
func (encoder numberEncoder) CanEncode(char rune) bool {
|
|
return utils.RuneToInt(char) != -1
|
|
}
|
|
|
|
func (encoder numberEncoder) GetSwitchCode(data string) int {
|
|
return switchCodeNumber
|
|
}
|
|
|
|
func (encoder numberEncoder) Encode(digits string) ([]int, error) {
|
|
digitCount := len(digits)
|
|
chunkCount := digitCount / 44
|
|
if digitCount%44 != 0 {
|
|
chunkCount++
|
|
}
|
|
|
|
codeWords := []int{}
|
|
|
|
for i := 0; i < chunkCount; i++ {
|
|
start := i * 44
|
|
end := start + 44
|
|
if end > digitCount {
|
|
end = digitCount
|
|
}
|
|
chunk := digits[start:end]
|
|
|
|
cws, err := encodeChunk(chunk)
|
|
if err != nil {
|
|
return codeWords, err
|
|
}
|
|
|
|
codeWords = append(codeWords, cws...)
|
|
}
|
|
|
|
return codeWords, nil
|
|
}
|
|
|
|
func encodeChunk(chunkInput string) ([]int, error) {
|
|
chunk := big.NewInt(0)
|
|
|
|
_, ok := chunk.SetString("1"+chunkInput, 10)
|
|
|
|
if !ok {
|
|
return nil, errors.New("Failed converting")
|
|
}
|
|
|
|
cws := []int{}
|
|
|
|
for chunk.Cmp(big.NewInt(0)) > 0 {
|
|
newChunk, cw := chunk.DivMod(
|
|
chunk,
|
|
big.NewInt(900),
|
|
big.NewInt(0),
|
|
)
|
|
|
|
chunk = newChunk
|
|
|
|
cws = append([]int{int(cw.Int64())}, cws...)
|
|
}
|
|
|
|
return cws, nil
|
|
}
|