-
Notifications
You must be signed in to change notification settings - Fork 1
/
wg26.go
83 lines (70 loc) · 2.06 KB
/
wg26.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
package wg26
import (
"encoding/binary"
"fmt"
"strings"
)
//
// Author: 陈哈哈 bitschen@163.com
//
const (
LengthCardSN = 10
LengthWG26SN = 8
)
var (
bigOrder = binary.BigEndian
)
// 维根26编码
type Wg26Id struct {
CardSN string // 原始十位卡号
CardHex string // 十六进制
Wg26Start uint16 // 前段
Wg26End uint16 // 后段
Wg26SN string // WG26标准卡号
}
// ValueOfCardSN 返回卡号字面字符串的数值类型
func (wg *Wg26Id) ValueOfCardSN() uint32 {
return uint32(ToInt64(wg.CardSN))
}
// ValueOfWg26SN 返回Wg26SN的字面字符串的数值类型
func (wg *Wg26Id) ValueOfWg26SN() uint32 {
return uint32(ToInt64(wg.Wg26SN))
}
// FormatWg26SN 返回Wg26字面格式化的卡号字符串
func (wg *Wg26Id) FormatWg26SN() string {
return AppendZero(fmt.Sprintf("%d,%d", wg.Wg26Start, wg.Wg26End), LengthWG26SN+1)
}
////
// 从标准10位卡号解析
func ParseFromCardNumber(number string) *Wg26Id {
value := TrimZeroToInt64(number)
return ParseFromCardNumberValue(uint32(value))
}
// ParseFromCardNumberValue 从标准10位卡号的整数卡号解析
func ParseFromCardNumberValue(number uint32) *Wg26Id {
b := make([]byte, 4)
bigOrder.PutUint32(b, number)
return ParseFromWg26([3]byte{b[1], b[2], b[3]})
}
// ParseFromWg26 从维根26国际标准编码解析;其中字节为[0] Start,[1-2] End
func ParseFromWg26(wg26bytes [3]byte) *Wg26Id {
start := uint16(wg26bytes[0])
end := bigOrder.Uint16(wg26bytes[1:])
return &Wg26Id{
CardSN: AppendZero(fmt.Sprintf("%d", bigOrder.Uint32([]byte{0, wg26bytes[0], wg26bytes[1], wg26bytes[2]})), LengthCardSN),
CardHex: fmt.Sprintf("%06X", wg26bytes),
Wg26Start: start,
Wg26End: end,
Wg26SN: fmt.Sprintf("%d%d", start, end),
}
}
// ParseFromWg26Number 从维根26标准字面卡号解析
func ParseFromWg26Number(wg26Number string) *Wg26Id {
std := fmt.Sprintf("%8s", wg26Number)
bytes := make([]byte, 2)
bigOrder.PutUint16(bytes, uint16(ToInt64(std[3:])))
return ParseFromWg26([3]byte{
byte(ToInt64(strings.TrimLeft(std[:3], " "))),
bytes[0],
bytes[1]})
}