在Python编程中,经常需要处理不同进制之间的转换。Python提供了一系列内置函数,如bin()、oct()、hex()以及int(),可以方便地在十进制、二进制、八进制、十六进制之间进行转换。本文将深入介绍这些函数的用法、参数含义及实际应用场景,并提供一个通用进制转换函数。
一、十进制转其他进制
1. bin() - 十进制转二进制
bin()函数接收一个十进制整数,返回以“0b”为前缀的二进制字符串。例如:- decimal_num = 10
- binary_str = bin(decimal_num)
- print(binary_str) # 输出: 0b1010
复制代码 若需要去除前缀,可以使用切片操作:bin(num)[2:]。负数转换时,bin()会在结果前添加负号,如bin(-5)返回'-0b101'。
2. oct() - 十进制转八进制
oct()类似地返回以“0o”为前缀的八进制字符串。示例:- decimal_num = 20
- print(oct(decimal_num)) # 输出: 0o24
复制代码 对于大数如255,oct(255)返回'0o377'。
3. hex() - 十进制转十六进制
hex()返回以“0x”为前缀的十六进制字符串,字母使用小写。例如:- decimal_num = 255
- print(hex(decimal_num)) # 输出: 0xff
- decimal_num = 170
- print(hex(decimal_num)) # 输出: 0xaa
复制代码 需要注意的是,这些函数都只接受整数作为参数。
二、其他进制转十进制
int()函数可以接收两个参数:字符串和表示该字符串原始进制的整数(base)。例如二进制转十进制:- binary_str = "1010"
- decimal = int(binary_str, 2)
- print(decimal) # 输出: 10
复制代码 同理,八进制字符串转十进制:int("24", 8)返回20;十六进制转十进制:int("ff", 16)返回255。
如果字符串包含进制前缀(如“0b”、“0o”、“0x”),可以将base参数设为0,让Python自动检测进制。例如:- int("0b1010", 0) # 10
- int("0o24", 0) # 20
- int("0xff", 0) # 255
复制代码 这种方式在处理带前缀的输入时非常方便。
三、任意进制之间的转换
Python没有直接提供从任意进制到任意进制的内置函数。可以通过“十进制作为中间进制”的方式实现。下面是一个通用转换函数:- def convert_base(number_str, from_base, to_base):
- # 先转换到十进制
- decimal = int(number_str, from_base)
- # 再从十进制转换到目标进制
- if to_base == 2:
- return bin(decimal)
- elif to_base == 8:
- return oct(decimal)
- elif to_base == 16:
- return hex(decimal)
- elif to_base == 10:
- return str(decimal)
- else:
- raise ValueError("不支持的进制")
复制代码 使用示例:- # 二进制转八进制
- print(convert_base("1010", 2, 8)) # 输出: 0o12
- # 十六进制转二进制
- print(convert_base("ff", 16, 2)) # 输出: 0b11111111
- # 八进制转十六进制
- print(convert_base("377", 8, 16)) # 输出: 0xff
复制代码 另一种方式是使用内置的format()函数进行格式化输出。format()可以指定格式说明符,如'b'(二进制)、'o'(八进制)、'x'(小写十六进制)、'X'(大写十六进制)。加前缀则使用'#b'、'#o'、'#x'等。- num = 255
- print(format(num, 'b')) # 11111111
- print(format(num, 'o')) # 377
- print(format(num, 'x')) # ff
- print(format(num, '#x')) # 0xff
复制代码
四、实际应用场景
1. 颜色值转换
在Web开发中,经常需要将RGB颜色值转换为十六进制字符串。以下实现直接使用format():- def rgb_to_hex(r, g, b):
- return f"#{format(r, '02x')}{format(g, '02x')}{format(b, '02x')}"
- print(rgb_to_hex(255, 128, 0)) # 输出: #ff8000
复制代码 反向转换则利用int()解析十六进制子串:- def hex_to_rgb(hex_color):
- hex_color = hex_color.lstrip('#')
- r = int(hex_color[0:2], 16)
- g = int(hex_color[2:4], 16)
- b = int(hex_color[4:6], 16)
- return r, g, b
- print(hex_to_rgb("#ff8000")) # 输出: (255, 128, 0)
复制代码
2. 文件权限处理
Linux系统中,文件权限常用rwx字符串或八进制数字表示。自定义函数可将rwx字符串转换为八进制:- def permissions_to_octal(perm_string):
- perm_dict = {'r': 4, 'w': 2, 'x': 1, '-': 0}
- octal = 0
- for i, char in enumerate(perm_string):
- octal += perm_dict[char] * (8 ** (2 - i))
- return oct(octal)
- print(permissions_to_octal("rwxr-xr--")) # 输出: 0o754
复制代码
3. 网络编程中的IP地址处理
将IP地址转换为二进制表示,有助于理解子网掩码等概念:- def ip_to_binary(ip):
- parts = ip.split('.')
- binary_parts = [format(int(part), '08b') for part in parts]
- return '.'.join(binary_parts)
- print(ip_to_binary("192.168.1.1")) # 输出: 11000000.10101000.00000001.00000001
复制代码
总结
本文详细介绍了Python内置的进制转换函数bin()、oct()、hex()、int()以及format()的使用方法和参数细节,并提供了通用转换函数及实际应用代码。掌握这些工具,可以高效处理各种进制转换需求,适用于数据处理、系统编程、网络通信等场景。 |