python处理进制的转换
最近要用到二进制十六进制和十进制之间的转换,并且还涉及到补码之间的转换。之前都是零零散散的用python做一下转换,但是使用频繁了,还是好好整理一下。
先上代码:
#!/usr/bin/env python
class radixConvert(object):
def __init__(self):
return None
def hexValuGet(self,srcNum=''):
return int(srcNum,16)
def decValueGet(self,srcNum=''):
return int(srcNum)
def binValueGet(self,srcNum=''):
return int(srcNum,2)
def hex2Dec(self,srcNum=''):
return str(self.hexValuGet(srcNum))
def cmpmtHex2Dec(self,srcNum='',binTotalLen=0):
return self.cmpmtBin2Dec(self.hex2Bin(srcNum,binTotalLen),binTotalLen)
def hex2Bin(self,srcNum='',binWidth=0):
rawBin='{0:b}'.format(self.hexValuGet(srcNum))
finalBinWidth=binWidth
if rawBin[0]=='-':
finalBinWidth=binWidth+1
if finalBinWidth==len(rawBin):
return rawBin
if finalBinWidth
return 'binary length is too small'
if finalBinWidth>len(rawBin):
return rawBin.zfill(finalBinWidth)
def dec2Bin(self,srcNum='',binWidth=0):
rawBin='{0:b}'.format(self.decValueGet(srcNum))
finalBinWidth=binWidth
if rawBin[0]=='-':
finalBinWidth=binWidth+1
if finalBinWidth==len(rawBin):
return rawBin
if finalBinWidth
return 'binary length is too small'
if finalBinWidth>len(rawBin):
return rawBin.zfill(finalBinWidth)
def dec2Bincmpmt(self,srcNum='',binWidth=0):
if srcNum[0]=='-':
return self.dec2Bin(str(2**binWidth+self.decValueGet(srcNum)),binWidth)
else:
return self.dec2Bin(srcNum,binWidth)
def dec2Hex(self,srcNum=''):
iniHex=hex(self.decValueGet(srcNum))
if iniHex[0]=='-':
dispHex=iniHex[0]+iniHex[3:-1]+iniHex[-1]
else:
dispHex=iniHex[2:-1]+iniHex[-1]
return dispHex
def dec2Hexcmpmt(self,srcNum='',binWidth=''):
binForm=self.dec2Bincmpmt(srcNum,binWidth)
return self.bin2Hex(binForm)
def bin2Hex(self,srcNum=''):
return self.dec2Hex(str(self.binValueGet(srcNum)))
def bin2Dec(self,srcNum=''):
return str(self.binValueGet(srcNum))
def cmpmtBin2Dec(self,srcNum='',binTotalLen=0):
iniValue=self.binValueGet(srcNum)
MaxValue=2**binTotalLen
tmpNum=srcNum.strip('0b')
if iniValue<0:
return 'the number you input is not a complement binary(only positive allowed)'
totalLenForm=tmpNum.zfill(binTotalLen)
if iniValue>MaxValue:
return 'overflow'
if totalLenForm[0]=='1':
return(str(iniValue-MaxValue))
else:
return(str(iniValue))
def cmpmtBin2Hex(self,srcNum='',binTotalLen=0):
return self.dec2Hex(self.cmpmtBin2Dec(srcNum,binTotalLen))
解释下radixConvert里会用到的方法函数。
hex2Dec就是将十六进制的字符串转换为十进制的字符串,该函数需要一个字符参数表示需要转换的十六进制字符串,返回转换后的十进制字符串,测试代码如下:
foo=radixConvert()
print foo.hex2Dec('0x12f')
print foo.hex2Dec('12f')
print foo.hex2Dec('-0x12f')
print foo.hex2Dec('-12f')
测试结果如下:
hex2Bin将十六进制的字符串转换为二进制的字符串,该函数需要一个字符参数和一个整数参数,分别表示需要转换的十六进制字符串和需要的二进制长度,返回一个二进制字符串,测试代码如下:
foo=radixConvert()
print foo.hex2Bin('0x12f',10)
print foo.hex2Bin('12f',10)
print foo.hex2Bin('-0x12f',10)
print foo.hex2Bin('-12f',10)
print foo.hex2Bin('0x12f',5)
测试结果如下:
最后一个测试返回的是binary length is to small,是因为0x12f对于长度为5的字符串是溢出的,所以返回了这个提示
dec2Bin将十进制的字符串转换为二进制的字符串,该函数需要一个字符参数和一个整数参数,分别表示需要转换的十进制字符串和需要的二进制长度,返回一个二进制字符串,测试代码如下:
foo=radixConvert()
print foo.dec2Bin('120',10)
print foo.dec2Bin('-120',10)
print foo.dec2Bin('120',5)
测试结果如下:
dec2Bincmpmt将十进制的字符串转换为补码的二进制的字符串,该函数需要一个字符参数和一个整数参数,分别表示需要转换的十进制字符串和需要的二进制长度(加符号位的长度),返回一个二进制字符串,测试代码如下:
foo=radixConvert()
print foo.dec2Bincmpmt('120',10)
print foo.dec2Bincmpmt('-120',10)
print foo.dec2Bincmpmt('120',5)
测试结果如下:
bin2Hex将二进制的字符串转换为十进制的字符串,该函数需要一个字符参数,表示需要转换的二进制字符串,返回一个十进制字符串,测试代码如下:
print foo.bin2Hex('110011')
print foo.bin2Hex('0b110011')
print foo.bin2Hex('-110011')
print foo.bin2Hex('-110011')
测试结果如下:
print foo.bin2Dec('110011')
print foo.bin2Dec('0b110011')
print foo.bin2Dec('-110011')
print foo.bin2Dec('-110011')
测试结果如下:
cmpmtBin2Dec将二进制补码的字符串转换为十进制的字符串,该函数需要一个字符参数和一个整数参数,表示需要转换的二进制补码字符串和补码的位宽,返回一个十进制字符串,测试代码如下:
foo=radixConvert()
总结一下哈,代码中包含了,
print foo.cmpmtBin2Dec('110011',6)
print foo.cmpmtBin2Dec('110011',8)
print foo.cmpmtBin2Dec('0b110011'6)
print foo.cmpmtBin2Dec('0b110011'8)
print foo.cmpmtBin2Dec('-110011',6)
print foo.cmpmtBin2Dec('-0b110011'8)
测试结果如下:
cmpmtBin2Hex将二进制补码的字符串转换为十六进制的字符串,该函数需要一个字符参数和一个整数参数,表示需要转换的二进制补码字符串和补码的位宽,返回一个十六进制字符串,测试代码如下:
foo=radixConvert()
print foo.cmpmtBin2Hex('110011',6)
print foo.cmpmtBin2Hex('110011',8)
print foo.cmpmtBin2Hex('0b110011',6)
print foo.cmpmtBin2Hex('0b110011',8)
print foo.cmpmtBin2Hex('-110011',6)
print foo.cmpmtBin2Hex('-0b110011',8)
测试结果如下:
差点忘了cmpmtHex2Dec,cmpmtHex2Dec将十六进制补码的字符串转换为十进制的字符串,该函数需要一个字符参数和一个整数参数,表示需要转换的十六进制补码字符串和补码的位宽,返回一个十进制字符串,测试代码如下:
foo=radixConvert()
print foo.cmpmtHex2Dec('f5',8)
print foo.cmpmtHex2Dec('a5',8)
print foo.cmpmtHex2Dec('f5',10)
测试结果如下:
2转10,
2转16,
补码2转10,
补码2转16,
10转16,
10转补码16,
10转补码2,
10转2,
16转10,
16转2,
补码16转10
其中用到了一个zfill是在字符串左边补零,有点意思