"""
Binary: Base16
Conversions from base16 to:
- base2
- base10
- ASCII
Author: Ian Doarn
"""
from pygorithm.binary.base2 import to_ascii as b2_to_ascii
from pygorithm.binary.binary_utils import pad
from math import pow
HEX_BINARY_VALUES = {
'0': '0000', '1': '0001', '2': '0010', '3': '0011',
'4': '0100', '5': '0101', '6': '0110', '7': '0111',
'8': '1000', '9': '1001', 'A': '1010', 'B': '1011',
'C': '1100', 'D': '1101', 'E': '1110', 'F': '1111'
}
HEX_LETTER_VALUES = {
'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
}
[docs]def to_base2(h, visualize=False):
"""
Convert hexadecimal to binary number
:param h: hexadecimal number
:param visualize: Show process
:return: binary number
"""
hex_char_list = list(h)
_list = []
for value in hex_char_list:
if visualize:
print("{} -> {}".format(
value, HEX_BINARY_VALUES[value]
))
_list.append(pad(HEX_BINARY_VALUES[value]))
return int(''.join(_list))
[docs]def to_base10(h, visualize=False):
"""
Convert hexadecimal number to decimal number
Send hex to a list and reverse. Evaluate each hex value
via HEX_LETTER_VALUES map. Enumerate the list,
using the equation: value * 16 ^ index
value is the hex char value: F -> 15
index is its position in the list: ['1', 'A', 'F'] F's index = 2
Continue this for each hex letter until we reach the end of the list,
summing all evaluated values.
:param h: hexadecimal number
:param visualize: Show process
:return: decimal number
"""
# Check to see if '0x' is at the beginning and remove it
if h[0:2] == '0x':
hex_char_list = list(h[2:])[::-1]
else:
hex_char_list = list(h)[::-1]
value = 0
for i, v in enumerate(hex_char_list):
if visualize:
print("{} -> {} || {} * (16 ^ {}) = {}".format(
v, str(HEX_LETTER_VALUES[v]),
str(HEX_LETTER_VALUES[v]),
str(i),
str(HEX_LETTER_VALUES[v] * (pow(16, i)))
))
value += HEX_LETTER_VALUES[v] * (pow(16, i))
return int(value)
[docs]def to_ascii(h_array, visualize=False):
"""
Convert base16 array to ASCII string
Input must be a list of strings:
Example::
array = [
'74', '68', '65',
'20', '71', '75',
'69', '63', '6B',
'20', '62', '72',
'6F', '77', '6E',
'20', '66', '6F',
'78', '20', '6A',
'75', '6D', '70',
'73', '20', '6F',
'76', '65', '72',
'20', '74', '68',
'65', '20', '6C',
'61', '7A', '79',
'20', '64', '6F',
'67'
]
result -> the quick brown fox jumps over the lazy dog
:param h_array: hex value array
:param visualize: Show process
:return: ASCII string
"""
string = ''
for h_value in h_array:
if visualize:
print("{} -> {} -> {}".format(
h_value,
to_base2(h_value),
b2_to_ascii(str(to_base2(h_value)))
))
string += b2_to_ascii(str(to_base2(h_value)))
return string