-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathCellSerialConverter.py
126 lines (95 loc) · 3.64 KB
/
CellSerialConverter.py
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# Converts Hex/Dec provided serial numbers to other formats
import re
import collections
Translation_Result = collections.namedtuple('Translation_Result',
'source_serial dec_val hex_val imei_val success has_imei')
def hex_to_dec(hex_serial):
"""Convert a given hexadecimal serial number to decimal format. Serial numbers must be
valid hexadecimal values and be of length 14 or 18"""
hex_serial = hex_serial.upper()
if re.match("^[A-Fa-f0-9]+$", hex_serial) is None:
return ""
if len(hex_serial) == 14:
left = hex_serial[:8]
right = hex_serial[8:]
left_dec_int = int(left, 16)
right_dec_int = int(right, 16)
output = str(left_dec_int).rjust(10, "0") + str(right_dec_int).rjust(8, "0")
elif len(hex_serial) == 8:
left = hex_serial[:2]
right = hex_serial[2:]
left_dec_int = int(left, 16)
right_dec_int = int(right, 16)
output = str(left_dec_int).rjust(3, "0") + str(right_dec_int).rjust(8, "0")
else:
return ""
return output
def dec_to_hex(dec_serial):
"""Convert a given decimal serial number to hexadecimal format. Serial numbers must be numeric
and either 18 or 11 digits."""
if re.match("^[0-9]+$", dec_serial) is None:
return ""
if len(dec_serial) == 18:
left = int(dec_serial[:10])
right = int(dec_serial[10:])
hex_left = hex(left)
hex_right = hex(right)
output = str(hex_left)[2:10] + str(hex_right)[2:].rjust(6, "0")
elif len(dec_serial) == 11:
left = int(dec_serial[:3])
right = int(dec_serial[3:])
hex_left = hex(left)
hex_right = hex(right)
output = str(hex_left)[2:] + str(hex_right).rjust(7, "0")[2:]
else:
return ""
return output.upper()
def calc_check_digit(meid):
"""
Calculate the check digit for a given meid. meid must be numeric and 14 digits.
"""
multiplier = 2
sum_val = 0
for c in reversed(meid):
current = int(c) * multiplier
sum_val = sum_val + int(current / 10) + current % 10
multiplier = 1 if multiplier == 2 else 2
check = 0 if sum_val % 10 == 0 else 10 - sum_val % 10
return check
def get_imei(meid):
"""
Return the IMEI for a given meid. MEID must be valid containing 14 numeric digits.
"""
if re.match("^[0-9]+$", meid) is None:
return ""
return meid + str(calc_check_digit(meid))
def translate_serial(serial):
"""
For a given serial return a named tuple containing the source serial (provided),
the decimal version (if valid), the hexadecimal version (if valid), the imei (if valid
and applicable to the given serial number) and flags for successful conversion and indicating if
the given serial has an imei.
"""
serial = serial.upper()
source_serial = serial
if len(serial) == 15:
serial = serial[:14]
dec_val = ""
hex_val = ""
if len(serial) in (18, 11) and str(serial).isnumeric():
dec_val = serial
hex_val = dec_to_hex(serial)
elif len(serial) in (14, 8):
dec_val = hex_to_dec(serial)
hex_val = serial
if dec_val == "" or hex_val == "":
dec_val = ""
hex_val = ""
if len(hex_val) == 14:
imei_val = get_imei(hex_val)
else:
imei_val = ""
return Translation_Result(source_serial=source_serial, dec_val=dec_val, hex_val=hex_val, imei_val=imei_val,
success=True if dec_val != "" else False, has_imei=True if imei_val != "" else False)
if __name__ == '__main__':
print(translate_serial("111111111111111111"))