Python程序说明:十进制到十六进制

时间:2014-04-13 17:56:27

标签: python hex

有人可以向我解释一下这是如何运作的吗?我一直在看,但我不明白。它似乎工作得很好,但对我的生活这没有任何意义。有人请帮忙。

# Convert a decimal to a hex as a string 
def decimalToHex(decimalValue):
    hex = ""

    while decimalValue != 0:
        hexValue = decimalValue % 16 
        hex = toHexChar(hexValue) + hex
        decimalValue = decimalValue // 16

    return hex

# Convert an integer to a single hex digit in a character 
def toHexChar(hexValue):
    if 0 <= hexValue <= 9:
        return chr(hexValue + ord('0'))
    else:  # 10 <= hexValue <= 15
        return chr(hexValue - 10 + ord('A'))

def main():
    # Prompt the user to enter a decimal integer
    decimalValue = eval(input("Enter a decimal number: "))

    print("The hex number for decimal", 
        decimalValue, "is", decimalToHex(decimalValue))

main() # Call the main function

2 个答案:

答案 0 :(得分:1)

打印字符

好吧,我会尝试解释一下。首先,让我们看一下将数字从0-15转换为0123的函数... ABCDEF:

def toHexChar(hexValue):
  if 0 <= hexValue <= 9:
    return chr(hexValue + ord('0'))
  else:  # 10 <= hexValue <= 15
    return chr(hexValue - 10 + ord('A'))

你可以看到,它处理两种情况:一种情况,其中数字0-9需要转换为来自&#39; 0&#39; 0的文本字符。到了&#39; 9&#39;,另一个需要将数字10-16转换成来自&#39; A&#39;到&#39; F&#39;它将根据ASCII码返回字符。例如,ord('A')返回65 .. chr()会将整数从65转换回ascii char&#39; A&#39;。

这就是打印功能。现在循环:

迭代次数直到所有的十六进制字符

while decimalValue != 0:

此循环将一直运行,直到不能获取16er块

hexValue = decimalValue % 16

正常模数。它从小数中提取一个块(hexValue将为0-15)

hex = toHexChar(hexValue) + hex

构建一个字符串。由于HEX被标准化为在左侧具有较大部分的数字,因此它在转换后的字符前面。

decimalValue = decimalValue // 16

准备下一个循环:使用floordiv(a, b)写为// b )删除此16er块。

实施例

让我们了解它的工作原理。让我们假设我们想要将数字255转换为HexString。它将通过调用modulo 255 % 16 = 15开始。然后它将被转换为toHexChar(15) = 'F'

下一步是删除16er块。如果我们使用正常除法,我们将获得255 / 16 = 15.9375。但是,这会被四舍五入,因为它在小数点之后的.5之上导致错误的行为(结果将是0x1FF )..这就是为什么我们必须使用一个floordivsion这是floor(255/16) = 15或不久:255 // 16 = 15

我希望这能更好地解释它,特别是为什么需要//。

答案 1 :(得分:1)

我将使用示例十进制数11开始解释。

11十进制是0xB

11模16是11.同意?这意味着hexValue变为整数11.

所以整数11传递给toHexChar。

所以我们有:

toHexChar(11)

11大于9,因此调用else路径。

11 - 10当然是1。

ascii值'A'是65或0x41,所以ord('A')得到65

1 + 65 = 66。

chr()函数将整数值转换为ASCII字符。 ascii 66是'B'。所以toHexChar返回'B'

因此,hex ='B'

现在,decimalValue // 16,记住这是整数除法,结果为零,因此我们突破了while循环,因此decimalToHex(11)返回'B'。

示例编号17。

17 modulo 16 = 1 - 我们有一个字符串'1'

17/16 = 1也。所以我们再循环一次。

在下一次迭代中,1%16产生1,toHexChar返回'1'作为结果。

hex = toHexChar(hexValue)+ hex

将意味着:

hex = toHexChar(1)+'1'

hex ='1'+'1'

结果为“11”

通过一些示例数字来思考。代替你去。

得到余数的基础是模16。其余部分不能立即使用,因为如果数字在10到16之间,则需要使用A-F字符,因此使用toHexChar函数。

然后你除以16然后继续剩下的剩余部分。