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
|
class Solution:
def __init__(self):
self.BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
# Pre-compute hex lookup table for O(1) conversion
self.hex_lookup = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,
'8': 8, '9': 9, 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15
}
def hexToBase64Optimized(self, hex: str) -> str:
if not hex:
return ""
# Convert hex to bytes using lookup table
bytes_data = []
for i in range(0, len(hex), 2):
byte_val = (self.hex_lookup[hex[i]] << 4) | self.hex_lookup[hex[i+1]]
bytes_data.append(byte_val)
ans = []
i = 0
# Process complete 3-byte groups
while i + 2 < len(bytes_data):
triplet = (bytes_data[i] << 16) | (bytes_data[i+1] << 8) | bytes_data[i+2]
ans.append(self.BASE64_CHARS[(triplet >> 18) & 0x3F])
ans.append(self.BASE64_CHARS[(triplet >> 12) & 0x3F])
ans.append(self.BASE64_CHARS[(triplet >> 6) & 0x3F])
ans.append(self.BASE64_CHARS[triplet & 0x3F])
i += 3
# Handle remaining bytes
if i < len(bytes_data):
triplet = bytes_data[i] << 16
if i + 1 < len(bytes_data):
triplet |= bytes_data[i+1] << 8
ans.append(self.BASE64_CHARS[(triplet >> 18) & 0x3F])
ans.append(self.BASE64_CHARS[(triplet >> 12) & 0x3F])
if i + 1 < len(bytes_data):
ans.append(self.BASE64_CHARS[(triplet >> 6) & 0x3F])
ans.append('=')
else:
ans.append('==')
return ''.join(ans)
def hexToBase64BytesMethod(self, hex: str) -> str:
if not hex:
return ""
# Alternative using Python's built-in bytes conversion
bytes_data = bytes.fromhex(hex)
ans = []
i = 0
while i + 2 < len(bytes_data):
triplet = (bytes_data[i] << 16) | (bytes_data[i+1] << 8) | bytes_data[i+2]
ans.extend([
self.BASE64_CHARS[(triplet >> 18) & 0x3F],
self.BASE64_CHARS[(triplet >> 12) & 0x3F],
self.BASE64_CHARS[(triplet >> 6) & 0x3F],
self.BASE64_CHARS[triplet & 0x3F]
])
i += 3
if i < len(bytes_data):
triplet = bytes_data[i] << 16
if i + 1 < len(bytes_data):
triplet |= bytes_data[i+1] << 8
ans.append(self.BASE64_CHARS[(triplet >> 18) & 0x3F])
ans.append(self.BASE64_CHARS[(triplet >> 12) & 0x3F])
if i + 1 < len(bytes_data):
ans.append(self.BASE64_CHARS[(triplet >> 6) & 0x3F])
ans.append('=')
else:
ans.extend(['=', '='])
return ''.join(ans)
|