今天做一道题需要写一个二进制转换成十六进制的脚本,由于初学python不甚了解,于是百度尝试着写,现总结如下:
首先python中没有二进制直接转换成十六进制的函数,需要先将二进制转换成十进制然后再转换成十六进制。于是先来看二进制转换成十进制:
python中的int()除了能把其他类型的数据转换成数字类型,还有一个用法:
int(string,base):其中string代表一个字符串(实际上是一个数字字符串),base是一个数,代表string代表的这个数是几进制【注意:不是要转换成几进制,而是数本身是几进制】;整个函数的功能就是讲string代表的数字转换成十进制。因此,有了这个函数,二进制转换成十进制就很简单,代码如下:
# 二进制 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
我的代码很简单就不解释了,要注意的一点就是求得h1后,反转后才得到十六进制字符串。
这里要注意字符串反转的技巧:
str1=“abcdef”
str2=str1[::-1]
这样str2就是fedcba
从网上找的代码:
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
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]])一下感觉高大上了,来解释下:
首先定义了一个字符串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'
到此二进制转换成十六进制就写完了,附上全部的代码:
# -*- 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 __name__=='__main__':
s1 = bin_to_dec("110011011010")
s2 = dec2hex(s1)
s3 = dec_to_hex(s1)
print(s2+'\n')
print(s3)