您的位置:首页 > 编程语言 > Python开发

python——进制转换

2014-08-15 20:48 686 查看
今天做一道题需要写一个二进制转换成十六进制的脚本,由于初学python不甚了解,于是百度尝试着写,现总结如下:

首先python中没有二进制直接转换成十六进制的函数,需要先将二进制转换成十进制然后再转换成十六进制。于是先来看二进制转换成十进制:

python中的int()除了能把其他类型的数据转换成数字类型,还有一个用法:

int(string,base):其中string代表一个字符串(实际上是一个数字字符串),base是一个数,代表string代表的这个数是几进制【注意:不是要转换成几进制,而是数本身是几进制】;整个函数的功能就是讲string代表的数字转换成十进制。因此,有了这个函数,二进制转换成十进制就很简单,代码如下:

<span style="font-size:18px;color:#ff0000;"># 二进制 to 十进制
def bin_to_dec(string_num):
return str(int(string_num, 2))  # int(string_num,2)的意思是string_num是一个二进制数字,将其用十进制表示出来。</span>


同理,可以写出其他进制转换成十进制的形式:

<span style="font-size:18px;color:#ff0000;"># 十六进制 to 十进制
def hex_to_dec(string_num):
return str(int(string_num, 16))

# 八进制 to 十进制
def oct_to_dec(string_num):
return str(int(string_num,8))</span>
然后:第二步写十进制转换成十六进制:

我自己写的代码如下:

<span style="font-size:18px;color:#ff0000;"># 十进制 to 十六进制
def dec_to_hex(string_num):
d=int(string_num)
h1=''
h2=''
m = d
while(m != 0):
r = m % 16
m = m // 16
if r == 10:
h1 = h1 + 'A'
elif r == 11:
h1 = h1 + 'B'
elif r == 12:
h1 = h1 + 'C'
elif r == 13:
h1 = h1 + 'D'
elif r == 14:
h1 = h1 + 'E'
elif r == 15:
h1 = h1 + 'F'
else:
h1 = h1 + str(r)
h2 = h1[::-1] #这要注意:将字符串反转过来才是十六进制数
return h2</span>

我的代码很简单就不解释了,要注意的一点就是求得h1后,反转后才得到十六进制字符串。

这里要注意字符串反转的技巧:

str1=“abcdef”

str2=str1[::-1]

这样str2就是fedcba

从网上找的代码:

<span style="font-size:18px;color:#ff0000;">base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
</span>
<span style="font-size:18px;color:#ff0000;">def dec2hex(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])

return ''.join([str(x) for x in mid[::-1]])</span>
一下感觉高大上了,来解释下:

首先定义了一个字符串base='0123456789ABCDEF',原来for循环还可以这样用。

然后定义了一个空的列表。然后来看一下divmod(num1,num2)这个函数:返回一个tuple,(div,mod)【(商,余数)】,求出余数之后追加到mid后面。

最后反转字符串,返回。

此处要讲一讲join函数:

join(list)中的参数是一个列表,使用方法:

>>> a=['hello','world']

>>> '?'.join(a) //这里是用问号连接

'hello?world'

>>> ','.join(a) //这里用逗号连接

'hello,world'

>>> ';'.join(a) //这里用分号连接

'hello;world'


到此二进制转换成十六进制就写完了,附上全部的代码:

<span style="font-size:18px;color:#ff0000;"># -*- coding: utf-8 -*-

import os,sys

# global definition
# base = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F]
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]

# 二进制 to 十进制
def bin_to_dec(string_num):
return str(int(string_num, 2))  # int(string_num,2)的意思是string_num是一个二进制数字,将其用十进制表示出来。

# 十六进制 to 十进制
def hex_to_dec(string_num):
return str(int(string_num, 16))

# 八进制 to 十进制
def oct_to_dec(string_num):
return str(int(string_num,8))

# 十进制 to 十六进制(法一)
def dec_to_hex(string_num):
d=int(string_num)
h1=''
h2=''
m = d
while(m != 0):
r = m % 16
m = m // 16
if r == 10:
h1 = h1 + 'A'
elif r == 11:
h1 = h1 + 'B'
elif r == 12:
h1 = h1 + 'C'
elif r == 13:
h1 = h1 + 'D'
elif r == 14:
h1 = h1 + 'E'
elif r == 15:
h1 = h1 + 'F'
else:
h1 = h1 + str(r)
h2 = h1[::-1]
return h2
# 十进制 to 十六进制(法二)
def dec2hex(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])

return ''.join([str(x) for x in mid[::-1]])

if __n
9ab6
ame__=='__main__':
s1 = bin_to_dec("110011011010")
s2 = dec2hex(s1)
s3 = dec_to_hex(s1)
print(s2+'\n')
print(s3)</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: