在Python中将二进制数转换为十六进制不能超过5位数(作业)

时间:2016-08-25 19:45:39

标签: python computer-science

我从我的计算机科学老师那里得到了一个程序,用于创建一个使用Python将二进制数转换为十六进制的程序。我已经使二进制文件正确转换为十进制/十进制并且十进制正确转换为十六进制,但它仅在二进制数小于5位时起作用(即01101正确结果为16和11111变为1F,但是像11010110愚蠢地成为" 6")这是我的代码:

def main():
    print("Convert binary numbers to hexadecimal.")

    binary = list(input("Enter a binary number: "))     # User input

    for i in range(len(binary)):    # Convert binary to list of integers
        binary[i] = int(binary[i])

    baseten = 0

    for i in range(len(binary)):    # Converts binary to base ten
        baseten = int(baseten + binary[i] * 2**i)

    x = int(0)
    while 16**(x+1) < baseten:      # Determines beginning value of exponent
        x+=1

    while x >= 0:
        value = int(baseten/16**x)

        if value < 10:
            print(value, end="")
        if value == 10:
            print("A", end="")
        if value == 11:
            print("B", end="")
        if value == 12:
            print("C", end="")
        if value == 13:
            print("D", end="")
        if value == 14:
            print("E", end="")
        if value == 15:
            print("F", end="")

        baseten-=int(16**x)

        x-=1

注意 - 我非常了解Java,我有超过一年的使用经验,所以不要期望不理解有点复杂的东西。此外,目标不仅仅是使用hex()函数。

3 个答案:

答案 0 :(得分:2)

我将专注于帮助您调试代码中出现的问题,而不是建议另一种方法。毕竟这是作业:)

正如其他人所注意到的,基本10转换的逻辑已关闭。二进制字符串01101相当于十进制中的13和十六进制中的D。这是因为您需要从最低有效位开始迭代二进制字符串。在不更改代码的情况下,您可以通过在转化循环中索引到len(binary) - 1 - i而不是i来执行此操作:

for i in range(len(binary)):    # Converts binary to base ten
    baseten = int(baseten + binary[len(binary) - 1 - i] * 2**i)

您的第二个问题是baseten-=int(16**x)应为baseten -= value*(16**x)

这些更改将正确返回D6二进制字符串11010110

答案 1 :(得分:0)

您可以将binary字符串转换为hex字符串(不使用hex()函数),如下所示:

>>> binary_string = '0000010010001101'
>>> '%0*X' % ((len(binary_string) + 3) // 4, int(binary_string, 2))
'048D'

使用binaryhexadecimal转换为hex()的方法更为简单,这可能对其他人有用:

>>> hex(int('010110', 2))
'0x16'

答案 2 :(得分:0)

以下程序可以将二进制数转换为十六进制数,但也可以根据您在代码中提供的设置转换为其他基数:

import string


TABLE = string.digits + string.ascii_uppercase


def main():
    initial_variable = input('Please enter a number: ')
    base_variable = 2
    convert_variable = 16
    integer = str_to_int(initial_variable, base_variable)
    hexadecimal = int_to_str(integer, convert_variable)
    print(hexadecimal)


def str_to_int(text, base):
    integer = 0
    for character in text:
        if character not in TABLE:
            raise ValueError('found unknown character')
        value = TABLE.index(character)
        if value >= base:
            raise ValueError('found digit outside base')
        integer *= base
        integer += value
    return integer


def int_to_str(integer, base):
    array = []
    while integer:
        integer, value = divmod(integer, base)
        array.append(TABLE[value])
    return ''.join(reversed(array))


if __name__ == '__main__':
    main()