def oct_to_hex(octnum): """Convert octal to hexadecimal. Uses binary conversion as an intermediate step. Instructions used for algorithm from: wikipedia.org/wiki/Octal#Octal_to_hexadecimal_conversion """ hexnum, binary = '', '' digits = unicode(octnum) for digit in digits: # Convert decimal to binary, pad where appropriate. if digit == '0': binnum = '000' elif digit == '1': binnum = '001' else: binnum = dec_to_bin(int(digit)) binnum = binnum.zfill(2) binary += binnum # Group remainder by 4 digits bin_groups = make_groups(binary, 4) if DEBUG: print_vars([['bin group x 4', bin_groups], ['oct => hex (bin)', binary]]) for group in bin_groups: # Add num, shave off individual 0x part from individual conversion. hexnum += unicode(bin_to_hex(group))[2:] return '0x{}'.format(hexnum)
def oct_to_hex(octnum): """Convert octal to hexadecimal. Uses binary conversion as an intermediate step. Instructions used for algorithm from: wikipedia.org/wiki/Octal#Octal_to_hexadecimal_conversion """ hexnum, binary = '', '' digits = unicode(octnum) for digit in digits: # Convert decimal to binary, pad where appropriate. if digit == '0': binnum = '000' elif digit == '1': binnum = '001' else: binnum = dec_to_bin(int(digit)) binnum = binnum.zfill(2) binary += binnum # Group remainder by 4 digits bin_groups = make_groups(binary, 4) if DEBUG: print_vars( [['bin group x 4', bin_groups], ['oct => hex (bin)', binary]]) for group in bin_groups: # Add num, shave off individual 0x part from individual conversion. hexnum += unicode(bin_to_hex(group))[2:] return '0x{}'.format(hexnum)
def dec_to_bin(num): """Convert integer to binary. Only handles positive integers.""" if num == 0: return '0' bits = divide_by(abs(num), 2) for k, bit in enumerate(bits): # Pad digits if necessary bits[k] = bit.zfill(1) res = ''.join(bits) if DEBUG: print_vars([['dec', num], ['dec => bin', res]], convert=True) return res
def oct_to_bin(num): """Convert octal to binary instructions used for algorithm from: wikipedia.org/wiki/Octal#Octal_to_binary_conversion """ binary = '' digits = unicode(num) for digit in digits: print_vars(['octal digit', digit]) binary += dec_to_bin(int(digit)).zfill(3) if DEBUG: print_vars(['octal to binary', binary]) return binary
def hex_to_oct(hexnum): """Convert hexadecimal to octal""" hexnum = unicode(hexnum) if hexnum.startswith('0x'): hexnum = hexnum[2:] octal = '' binary = '0' + hex_to_bin(hexnum) groups = make_groups(binary, 3) if DEBUG: print_vars(['Hex to octal', binary]) print_vars(['Hex to octal (binary groups)', groups]) for group in groups: octal += unicode(bin_to_oct(group)) return int(octal)
def make_groups(string, count): """Make a set of groups with a string. e.g. >>> make_groups('ABCDEFGH', 2) = [['AB', 'CD', 'EF', 'GH']] Raises ValueError if modulus operation results in uneven group distribution. """ groups = [] if count == 0: return [string] if len(string) % count != 0: raise ValueError( 'Modulus `{}` on string `{}` of length `{}` is not uniform.'.format( count, string, len(string))) else: for k in range(0, len(string), count): groups.append(string[k: k + count]) if DEBUG: print_vars(['called via `make_groups`', groups]) return groups
def make_groups(string, count): """Make a set of groups with a string. e.g. >>> make_groups('ABCDEFGH', 2) = [['AB', 'CD', 'EF', 'GH']] Raises ValueError if modulus operation results in uneven group distribution. """ groups = [] if count == 0: return [string] if len(string) % count != 0: raise ValueError( 'Modulus `{}` on string `{}` of length `{}` is not uniform.'. format(count, string, len(string))) else: for k in range(0, len(string), count): groups.append(string[k:k + count]) if DEBUG: print_vars(['called via `make_groups`', groups]) return groups
def hex_to_bin(hexnum): """Convert hexadecimal to binary""" binary = dec_to_bin(hex_to_dec(hexnum)) if DEBUG: print_vars(['Hex to bin', binary]) return binary