我从我的计算机科学老师那里得到了一个程序,用于创建一个使用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()函数。
答案 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'
使用binary
将hexadecimal
转换为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()