python进制转换时使用内置的int, hex, bin, oct时,要注意入参是否是字符串,以及函数入参是否必须为整数。
先看一段代码:
origin = 12345
hex_data = hex(origin)
print(hex_data) # 0x3039
print(int(0x3039)) # 12345
print(int(str(hex_data), 16)) # 12345
print(int("0x3039", 16)) # 12345
# 二进制
bin_data = bin(origin)
print(bin_data)
print(int('0b11000000111001', 2)) # 0b11000000111001
print(int(bin_data, 2)) # 12345
print(int(hex_data, 16)) # 12345
# 二进制转16进制
print(hex(int(bin_data, 2))) # 0x3039
print(hex(bin_data)) #TypeError: 'str' object cannot be interpreted as an integer
# hex:Return the hexadecimal representation of an integer.
print(int(bin_data)) # ValueError: invalid literal for int() with base 10: '0b11000000111001'
print(int(hex_data)) # ValueError: invalid literal for int() with base 10: '0x3039'
- 使用hex函数得到16进制,但是将返回结果直接转成10进制时会报错
hex_data = hex(origin)
print(int(hex_data)) # # ValueError: invalid literal for int() with base 10: '0x3039'
print(int("0x3039", 16))
print(int(hex_data, 16))
int函数的定义是将数字类型或者字符串类型转成整数
函数定义为def __init__(self, x, base=10)
而hex函数返回的整数的16进制表示,其实是有引号的,也就是说可以把结果看成字符串
下面是终端输出结果
hex(12345)
'0x3039'
但是单纯的0x3039其实是16进制,也就是数字类型,所以可以直接使用int(0x3039)
但是hex得到的返回值是字符串类型,所以在使用int函数时需要注明要转的字符串里面的内容是什么进制的,比如:int('0x3039', 16)
但是pycharm上使用print得到的结果并没有引号,所以会报错:
print(int(hex_data)) # ValueError: invalid literal for int() with base 10: '0x3039'
- 其他进制相互转换时,需要先转成10进制,再转成其他进制
比如要将2进制转成16进制,过程是2进制–>10进制–>16进制
因为hex(16进制),bin(二进制),oct(八进制)函数入参只接受整数。
比如八进制的函数定义:
def oct(*args, **kwargs): # real signature unknown; NOTE: unreliably restored from __doc__
"""
Return the octal representation of an integer.
>>> oct(342391)
'0o1234567'
"""
pass
eg:将12345对应的二进制转成16进制
先将0b11000000111001转成10进制,再用hex函数转成16进制
hex(int('0b11000000111001', 2))
以上,结合函数定义可以弄清楚如何使用python内置函数进行进制之间的转换。