number_encoder.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package pdf417
  2. import (
  3. "errors"
  4. "math/big"
  5. "github.com/boombuler/barcode/utils"
  6. )
  7. type numberEncoder struct{}
  8. func newNumberEncoder() *numberEncoder {
  9. return new(numberEncoder)
  10. }
  11. func (encoder numberEncoder) CanEncode(char rune) bool {
  12. return utils.RuneToInt(char) != -1
  13. }
  14. func (encoder numberEncoder) GetSwitchCode(data string) int {
  15. return switchCodeNumber
  16. }
  17. func (encoder numberEncoder) Encode(digits string) ([]int, error) {
  18. digitCount := len(digits)
  19. chunkCount := digitCount / 44
  20. if digitCount%44 != 0 {
  21. chunkCount++
  22. }
  23. codeWords := []int{}
  24. for i := 0; i < chunkCount; i++ {
  25. start := i * 44
  26. end := start + 44
  27. if end > digitCount {
  28. end = digitCount
  29. }
  30. chunk := digits[start:end]
  31. cws, err := encodeChunk(chunk)
  32. if err != nil {
  33. return codeWords, err
  34. }
  35. codeWords = append(codeWords, cws...)
  36. }
  37. return codeWords, nil
  38. }
  39. func encodeChunk(chunkInput string) ([]int, error) {
  40. chunk := big.NewInt(0)
  41. _, ok := chunk.SetString("1"+chunkInput, 10)
  42. if !ok {
  43. return nil, errors.New("Failed converting")
  44. }
  45. cws := []int{}
  46. for chunk.Cmp(big.NewInt(0)) > 0 {
  47. newChunk, cw := chunk.DivMod(
  48. chunk,
  49. big.NewInt(900),
  50. big.NewInt(0),
  51. )
  52. chunk = newChunk
  53. cws = append([]int{int(cw.Int64())}, cws...)
  54. }
  55. return cws, nil
  56. }