# 将字符串从右向左按照n位一组进行分组(二转十六进制和二转八进制所依赖的方法)defsplitStr(string, num):
index,str, splitList = num -len(string)% num,"",[]for i in string:str, index =str+ i, index +1if index % num ==0:
splitList.append(str)str=""return splitList
# 任意进制转十进制(可能会溢出)deftoDec(numStr, adecimal, dec =0):for i in numStr:
dec = dec * adecimal +"0123456789abcdef".find(i.lower())return dec
# 十进制转二进制(可能会溢出)defdecToBin(dec,bin=[]):while1:bin.insert(0,str(dec %2))
dec //=2if dec ==1:bin.insert(0,"1")breakreturn"".join(bin)# 二进制转十六进制defbinToHex(bin,hex=""):for i in splitStr(bin,4):hex+="0123456789ABCDEF"[toDec(i,2)]returnhex# 十六进制转二进制defhexToBin(hex,bin=""):
binL ={"0":"0000","1":"0001","2":"0010","3":"0011","4":"0100","5":"0101","6":"0110","7":"0111","8":"1000","9":"1001","a":"1010","b":"1011","c":"1100","d":"1101","e":"1110","f":"1111"}for i inhex:bin+= binL[i.lower()]ifbin[0]=="0":# 去掉前面的0bin=bin[1:]ifbin[0]=="0":bin=bin[1:]ifbin[0]=="0":bin=bin[1:]returnbin# 二进制转八进制defbinToOct(bin,oct=""):for i in splitStr(bin,3):oct+="01234567"[toDec(i,2)]returnoct# 八进制转二进制defoctToBin(oct):
binL ={"0":"000","1":"001","2":"010","3":"011","4":"100","5":"101","6":"110","7":"111"}bin=""for i inoct:bin+= binL[i.lower()]ifbin[0]=="0":# 去掉前面的0bin=bin[1:]ifbin[0]=="0":bin=bin[1:]returnbinif __name__ =="__main__":print("\n----------字符串分组-----------")print(splitStr("10010101011",4))print("\n----------任意进制转十进制-----------")print(toDec("4Ab",16))# 十六进制转十进制print(toDec("1195",10))# 十进制转十进制print(toDec("2253",8))# 八进制转十进制print(toDec("10010101011",2))# 二进制转十进制print("\n----------十进制转二进制-----------")print(decToBin(1195))# 十进制转二进制(可能会溢出)print("\n----------二进制十六进制互转-----------")print(binToHex("10010101011"))# 二进制转十六进制print(hexToBin("4Ab"))# 十六进制转二进制print("\n----------二进制八进制互转-----------")print(binToOct("10010101011"))# 二进制转八进制print(octToBin("2253"))# 八进制转二进制