File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ """
2+ * Author: Siddharth Singh (https://github.com/coolsidd)
3+ * Description: Convert a binary string to Base64.
4+
5+ References for better understanding:
6+ https://en.wikipedia.org/wiki/Base64
7+ """
8+
9+ BITS_TO_B64 = {
10+ "000000" : "A" ,
11+ "000001" : "B" ,
12+ "000010" : "C" ,
13+ "000011" : "D" ,
14+ "000100" : "E" ,
15+ "000101" : "F" ,
16+ "000110" : "G" ,
17+ "000111" : "H" ,
18+ "001000" : "I" ,
19+ "001001" : "J" ,
20+ "001010" : "K" ,
21+ "001011" : "L" ,
22+ "001100" : "M" ,
23+ "001101" : "N" ,
24+ "001110" : "O" ,
25+ "001111" : "P" ,
26+ "010000" : "Q" ,
27+ "010001" : "R" ,
28+ "010010" : "S" ,
29+ "010011" : "T" ,
30+ "010100" : "U" ,
31+ "010101" : "V" ,
32+ "010110" : "W" ,
33+ "010111" : "X" ,
34+ "011000" : "Y" ,
35+ "011001" : "Z" ,
36+ "011010" : "a" ,
37+ "011011" : "b" ,
38+ "011100" : "c" ,
39+ "011101" : "d" ,
40+ "011110" : "e" ,
41+ "011111" : "f" ,
42+ "100000" : "g" ,
43+ "100001" : "h" ,
44+ "100010" : "i" ,
45+ "100011" : "j" ,
46+ "100100" : "k" ,
47+ "100101" : "l" ,
48+ "100110" : "m" ,
49+ "100111" : "n" ,
50+ "101000" : "o" ,
51+ "101001" : "p" ,
52+ "101010" : "q" ,
53+ "101011" : "r" ,
54+ "101100" : "s" ,
55+ "101101" : "t" ,
56+ "101110" : "u" ,
57+ "101111" : "v" ,
58+ "110000" : "w" ,
59+ "110001" : "x" ,
60+ "110010" : "y" ,
61+ "110011" : "z" ,
62+ "110100" : "0" ,
63+ "110101" : "1" ,
64+ "110110" : "2" ,
65+ "110111" : "3" ,
66+ "111000" : "4" ,
67+ "111001" : "5" ,
68+ "111010" : "6" ,
69+ "111011" : "7" ,
70+ "111100" : "8" ,
71+ "111101" : "9" ,
72+ "111110" : "+" ,
73+ "111111" : "/" ,
74+ }
75+
76+
77+ def bin_to_base64 (bin_str : str ) -> str :
78+ """Convert a binary value to its base64 equivalent
79+
80+
81+ >>> bin_to_base64("000001")
82+ 'AB'
83+ >>> bin_to_base64("0")
84+ 'A'
85+ >>> bin_to_base64("1")
86+ 'B'
87+ >>> bin_to_base64("-1")
88+ '-B'
89+ >>> bin_to_base64(" -000001 ")
90+ '-AB'
91+ >>> bin_to_base64("0-0")
92+ Traceback (most recent call last):
93+ ...
94+ ValueError: Non-binary value was passed to the function
95+ >>> bin_to_base64("")
96+ Traceback (most recent call last):
97+ ...
98+ ValueError: Empty string was passed to the function
99+ """
100+ bin_str = str (bin_str ).strip ()
101+ if not bin_str :
102+ raise ValueError ("Empty string was passed to the function" )
103+ is_negative = bin_str [0 ] == "-"
104+ if is_negative :
105+ bin_str = bin_str [1 :]
106+ if not all (char in "01" for char in bin_str ):
107+ raise ValueError ("Non-binary value was passed to the function" )
108+ bin_str = "0" * (6 * (divmod (len (bin_str ), 6 )[0 ] + 1 ) - len (bin_str )) + bin_str
109+ base64_str = ""
110+ while len (bin_str ) > 0 :
111+ base64_str += BITS_TO_B64 [bin_str [:6 ]]
112+ bin_str = bin_str [6 :]
113+
114+ return "-" + base64_str if is_negative else base64_str
115+
116+
117+ if __name__ == "__main__" :
118+ from doctest import testmod
119+
120+ testmod ()
You can’t perform that action at this time.
0 commit comments