-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcode_s25.go
110 lines (95 loc) · 1.83 KB
/
code_s25.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package barcode
import (
"strconv"
)
/**
* Standard 2 of 5 barcodes
* Used in airline ticket markin, photofinishing
* Contains digits (0 to 9) and encodes the data only in the width of bars
*/
func barcodeS25(code string, checksum bool) *barArray {
chrS25 := map[string]string{
"0": "10101110111010",
"1": "11101010101110",
"2": "10111010101110",
"3": "11101110101010",
"4": "10101110101110",
"5": "11101011101010",
"6": "10111011101010",
"7": "10101011101110",
"8": "10101110111010",
"9": "10111010111010",
}
if checksum {
code = code + checksumS25(code)
}
if len(code)%2 != 0 {
// add leading zero if code-length is odd
code = "0" + code
}
seq := "11011010"
for i := 0; i < len(code); i++ {
digit := string([]rune(code)[i])
if chrS25[digit] == "" {
return nil
}
seq = seq + chrS25[digit]
}
seq = seq + "1101011"
arr := &barArray{
Code: code,
MaxW: 0,
MaxH: 1,
BCode: []bCode{},
}
return binaryToArr(seq, arr)
}
func binaryToArr(seq string, arr *barArray) *barArray {
w := 0
for i := 0; i < len(seq); i++ {
w++
v, _ := strconv.Atoi(string(seq[i]))
var vX int
if len(seq) != i+1 {
vX, _ = strconv.Atoi(string(seq[i+1]))
} else {
vX = 0
}
if i == (len(seq)-1) || i < (len(seq)-1) && v != vX {
var t bool
if v == 1 {
t = true
} else {
t = false
}
_ = t
arr.BCode = append(arr.BCode, bCode{
T: t,
W: w,
H: 1,
P: 0,
})
arr.MaxW += w
w = 0
}
}
return arr
}
// checksumS25 calculates the digit checksum of S25 code
func checksumS25(code string) string {
sum := 0
for i := 0; i < len(code); i += 2 {
v, _ := strconv.Atoi(string(code[i]))
sum += v
}
sum *= 3
for i := 1; i < len(code); i += 2 {
v, _ := strconv.Atoi(string(code[i]))
sum += v
}
r := sum % 10
if r > 0 {
r = (10 - r)
}
return strconv.Itoa(r)
}