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是在字符串左边补零,有点意思
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值