查看: 88|回复: 3

Python进制转换:bin、oct、hex、int内置函数用法与实战

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Python编程中,经常需要处理不同进制之间的转换。Python提供了一系列内置函数,如bin()、oct()、hex()以及int(),可以方便地在十进制、二进制、八进制、十六进制之间进行转换。本文将深入介绍这些函数的用法、参数含义及实际应用场景,并提供一个通用进制转换函数。

一、十进制转其他进制

1. bin() - 十进制转二进制
bin()函数接收一个十进制整数,返回以“0b”为前缀的二进制字符串。例如:
  1. decimal_num = 10
  2. binary_str = bin(decimal_num)
  3. print(binary_str)  # 输出: 0b1010
复制代码
若需要去除前缀,可以使用切片操作:bin(num)[2:]。负数转换时,bin()会在结果前添加负号,如bin(-5)返回'-0b101'。

2. oct() - 十进制转八进制
oct()类似地返回以“0o”为前缀的八进制字符串。示例:
  1. decimal_num = 20
  2. print(oct(decimal_num))  # 输出: 0o24
复制代码
对于大数如255,oct(255)返回'0o377'。

3. hex() - 十进制转十六进制
hex()返回以“0x”为前缀的十六进制字符串,字母使用小写。例如:
  1. decimal_num = 255
  2. print(hex(decimal_num))  # 输出: 0xff
  3. decimal_num = 170
  4. print(hex(decimal_num))  # 输出: 0xaa
复制代码
需要注意的是,这些函数都只接受整数作为参数。

二、其他进制转十进制

int()函数可以接收两个参数:字符串和表示该字符串原始进制的整数(base)。例如二进制转十进制:
  1. binary_str = "1010"
  2. decimal = int(binary_str, 2)
  3. print(decimal)  # 输出: 10
复制代码
同理,八进制字符串转十进制:int("24", 8)返回20;十六进制转十进制:int("ff", 16)返回255。

如果字符串包含进制前缀(如“0b”、“0o”、“0x”),可以将base参数设为0,让Python自动检测进制。例如:
  1. int("0b1010", 0)   # 10
  2. int("0o24", 0)     # 20
  3. int("0xff", 0)     # 255
复制代码
这种方式在处理带前缀的输入时非常方便。

三、任意进制之间的转换

Python没有直接提供从任意进制到任意进制的内置函数。可以通过“十进制作为中间进制”的方式实现。下面是一个通用转换函数:
  1. def convert_base(number_str, from_base, to_base):
  2.     # 先转换到十进制
  3.     decimal = int(number_str, from_base)
  4.     # 再从十进制转换到目标进制
  5.     if to_base == 2:
  6.         return bin(decimal)
  7.     elif to_base == 8:
  8.         return oct(decimal)
  9.     elif to_base == 16:
  10.         return hex(decimal)
  11.     elif to_base == 10:
  12.         return str(decimal)
  13.     else:
  14.         raise ValueError("不支持的进制")
复制代码
使用示例:
  1. # 二进制转八进制
  2. print(convert_base("1010", 2, 8))   # 输出: 0o12
  3. # 十六进制转二进制
  4. print(convert_base("ff", 16, 2))    # 输出: 0b11111111
  5. # 八进制转十六进制
  6. print(convert_base("377", 8, 16))   # 输出: 0xff
复制代码
另一种方式是使用内置的format()函数进行格式化输出。format()可以指定格式说明符,如'b'(二进制)、'o'(八进制)、'x'(小写十六进制)、'X'(大写十六进制)。加前缀则使用'#b'、'#o'、'#x'等。
  1. num = 255
  2. print(format(num, 'b'))   # 11111111
  3. print(format(num, 'o'))   # 377
  4. print(format(num, 'x'))   # ff
  5. print(format(num, '#x'))  # 0xff
复制代码

四、实际应用场景

1. 颜色值转换
在Web开发中,经常需要将RGB颜色值转换为十六进制字符串。以下实现直接使用format():
  1. def rgb_to_hex(r, g, b):
  2.     return f"#{format(r, '02x')}{format(g, '02x')}{format(b, '02x')}"
  3. print(rgb_to_hex(255, 128, 0))  # 输出: #ff8000
复制代码
反向转换则利用int()解析十六进制子串:
  1. def hex_to_rgb(hex_color):
  2.     hex_color = hex_color.lstrip('#')
  3.     r = int(hex_color[0:2], 16)
  4.     g = int(hex_color[2:4], 16)
  5.     b = int(hex_color[4:6], 16)
  6.     return r, g, b
  7. print(hex_to_rgb("#ff8000"))  # 输出: (255, 128, 0)
复制代码

2. 文件权限处理
Linux系统中,文件权限常用rwx字符串或八进制数字表示。自定义函数可将rwx字符串转换为八进制:
  1. def permissions_to_octal(perm_string):
  2.     perm_dict = {'r': 4, 'w': 2, 'x': 1, '-': 0}
  3.     octal = 0
  4.     for i, char in enumerate(perm_string):
  5.         octal += perm_dict[char] * (8 ** (2 - i))
  6.     return oct(octal)
  7. print(permissions_to_octal("rwxr-xr--"))  # 输出: 0o754
复制代码

3. 网络编程中的IP地址处理
将IP地址转换为二进制表示,有助于理解子网掩码等概念:
  1. def ip_to_binary(ip):
  2.     parts = ip.split('.')
  3.     binary_parts = [format(int(part), '08b') for part in parts]
  4.     return '.'.join(binary_parts)
  5. print(ip_to_binary("192.168.1.1"))  # 输出: 11000000.10101000.00000001.00000001
复制代码

总结
本文详细介绍了Python内置的进制转换函数bin()、oct()、hex()、int()以及format()的使用方法和参数细节,并提供了通用转换函数及实际应用代码。掌握这些工具,可以高效处理各种进制转换需求,适用于数据处理、系统编程、网络通信等场景。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python进制转换:bin、oct、hex、int内置函数用法与实战

感谢楼主的详细分享!这篇教程把Python内置的进制转换函数讲得很清楚,特别是int()带base参数自动检测前缀的技巧很实用,之前一直手动去掉前缀再转换,现在方便多了。 那个通用转换函数convert_base也很棒,以十进制为中间桥接的思路简洁明了。自己平时写颜色转换时常用format()的'02x'格式化,确实比手动拼串省事不少。另外提一个补充:对于二进制、八进制、十六进制字符串去除前缀,用切片或lstrip('0x')等方式都行,但用int('0b1010', 0)自动检测更优雅。 楼主提到的文件权限转换例子也很有启发性,之前没想过用这种字典映射的方式将rwx字符串转八进制。谢谢分享,收藏了!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python进制转换:bin、oct、hex、int内置函数用法与实战

这篇帖子整理得很全面啊!bin、oct、hex和int的用法讲得很清楚,特别是int(string, base)自动检测前缀的那个技巧,平时用文档查一下也能找到,但这样总结出来方便多了。 那个通用转换函数和format()的对比也很有用,平时我写颜色转换都是自己拼字符串,看到rgb_to_hex那个例子,直接用format加'02x'的格式,简洁多了。还有文件权限那个部分,把rwx映射成八进制数字,思路很巧妙,之前没这么想过。谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python进制转换:bin、oct、hex、int内置函数用法与实战

您好,楼主整理得很详细,函数用法和代码示例都很实用。特别是那个`convert_base`通用函数,作为中间进制转换的思路很清晰。RGB和文件权限的例子也直接能用,保存下来以后写脚本时可以快速参考。谢谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-3 14:37 , Processed in 0.032761 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部