二十十六进制间的转换(整型)
前段时间用Python做了一个2/10/16进制之间转换的程序,用来解决IP地址的不同进制表示问题。把代码记到这里。
1、先设置编码utf-8,
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# motsqueen 2006-11-30
# base.py
# 2/10/16 base
2、设置各进制中可以出现的元素,并检查输入的串是否合法。
# build elements in base 2, 10, 16.
hexi = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
deci = hexi[:10]
bina = hexi[:2]
# 判断iterable1中的任一元素是否在iterable2中,如果每一个都在,返回True,否则返回False
def AnyInSet(iterable1, iterable2):
iter1 = set(iterable1)
iter2 = set(iterable2)
if len(iter1) == 0:
return False
return iter1.issubset(iter2)
def AnyinMaxMin(iterable, mini,maxi,isIn = True):
for element in iterable:
if elementmini or element>maxi:
return False
return True
def AnyoutMaxMin(iterable, mini, maxi, isIn=True):
for element in iterable:
if mini= element = maxi:
return False
return True
3、int()函数可以完成2/16/->/10的转换,直接调用;baseto()则完成10->2/16的转换。其中输入的参数都是数字式的字符串,输出也是。
# 把二进制或十六进制字符串转换成十进制整数可用自带的函数int
"""
如把二进制字符串转换成十进制整数:
int('1011',2) = 11
把十六进制字符串转换成十进制整数:
int('B',16) = 11
"""
# 把十进制数整数转换成二进制或十六进制字符串,另外一种实现
def baseto(num,base=2):
'''
convert number from decimal to base 1~10
'''
lis = []
while True:
num,rem = divmod(num,base)
lis.append(hexi[rem])
if num == 0:
break
return ''.join([str(x) for x in lis[::-1]])
4、102互相转换直接使用上面的两个函数int()和baseto()。而216则先转换成10进制,然后再转换: 21016的步骤。当然也可以使用另外的实现方式。因为这些代码主要面对IP地址这样的有限的计算,所以效率问题不是很突出。
# tag one: 二进制、十进制和十六进制之间转换
def dec2bin(string_num):
num = int(string_num)
return baseto(num,2)
def dec2hex(string_num):
num = int(string_num)
return baseto(num,16)
def bin2dec(string_num):
return str(int(string_num,2))
def hex2dec(string_num):
string_num = string_num.upper()
return str(int(string_num,16))
def hex2bin(string_num):
string_num = string_num.upper()
return dec2bin(hex2dec(string_num))
def bin2hex(string_num):
return dec2hex(bin2dec(string_num))
5、然后使用Wxpython做了个简单的界面,因为很简陋,代码就不放出来了。