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')
测试结果如下:
python处理进制的转换
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)
测试结果如下:
python处理进制的转换
最后一个测试返回的是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)
测试结果如下:
python处理进制的转换
dec2Bincmpmt将十进制的字符串转换为补码的二进制的字符串,该函数需要一个字符参数和一个整数参数,分别表示需要转换的十进制字符串和需要的二进制长度(加符号位的长度),返回一个二进制字符串,测试代码如下:
    foo=radixConvert()
    print foo.dec2Bincmpmt('120',10)
    print foo.dec2Bincmpmt('-120',10)
    print foo.dec2Bincmpmt('120',5)
测试结果如下:
python处理进制的转换
bin2Hex将二进制的字符串转换为十进制的字符串,该函数需要一个字符参数,表示需要转换的二进制字符串,返回一个十进制字符串,测试代码如下:
    print foo.bin2Hex('110011')
    print foo.bin2Hex('0b110011')
    print foo.bin2Hex('-110011')
    print foo.bin2Hex('-110011')
测试结果如下:
python处理进制的转换
bin2Dec将二进制的字符串转换为十六进制的字符串,该函数需要一个字符参数,表示需要转换的二进制字符串,返回一个十六进制字符串,测试代码如下:
    print foo.bin2Dec('110011')
    print foo.bin2Dec('0b110011')
    print foo.bin2Dec('-110011')
    print foo.bin2Dec('-110011')
测试结果如下:
python处理进制的转换
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)
测试结果如下:
python处理进制的转换

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)
测试结果如下:
python处理进制的转换
前四个正确的用法没问题,后面输入两个负的二进制,就报错了。原因我现在知道了,但是就是不想改了,只要按照正确的方法使用就ok了。
差点忘了cmpmtHex2Dec,cmpmtHex2Dec将十六进制补码的字符串转换为十进制的字符串,该函数需要一个字符参数和一个整数参数,表示需要转换的十六进制补码字符串和补码的位宽,返回一个十进制字符串,测试代码如下:
    foo=radixConvert()
    print foo.cmpmtHex2Dec('f5',8)
    print foo.cmpmtHex2Dec('a5',8)
    print foo.cmpmtHex2Dec('f5',10)
测试结果如下:
python处理进制的转换


总结一下哈,代码中包含了,
2转10,
2转16,
补码2转10,
补码2转16,
10转16,
10转补码16,
10转补码2,
10转2,
16转10,
16转2,
补码16转10

其中用到了一个zfill是在字符串左边补零,有点意思