十六进制转八进制

以下是本人的代码块,可运行,小白可以看看思路,也希望大佬可以在本人的基础上在进行一点修改,谢谢!

# 十六进制转换
a = input('输入一个十六进制数')  # 输入一个十六进制数字
b = []  # 存储输入的十六进制数字
c = ''  # 空的字符串用来放置十六进制转换后的二进制
d = []  # 存储c
for i in a:  # 放入
    b.append(i)

while b[0] == '0' and len(b) > 1:  # 如果说输入的第一个数字是0就进行删除,没有前置0
    b.remove('0')  # 进行删除
for j in range(len(b)):  # 循环
    if 'A' <= b[j] <= 'F':  # 十六进制10是A,11是B以此类推
        b[j] = str(ord(b[j]) - 55)  # 利用Ascll码对字母进行一个置换变成数字
        for z in range(4):  # 十六进制数用四位2进制数字表示所以循环四次
            if int(b[j]) != 0:  # 对它进行二进制转换运算,简单的一个取2求余
                c += str(int(b[j]) % 2)
                b[j] = str(int(b[j]) // 2)
            else:  # 当它为0的时候,就会在前面添加0
                c += '0'
        d.append(c[::-1])  # 将一个二进制数字放入到列表存储
        c = ''  # 四个二进制数字后变回原样再次重新进行进行放入
    elif '1' <= b[j] <= '9':  # 字母和数字分开,因为我输入的是一个字符串所以不能开始就整型
        for z in range(4):  # 与上面同理
            if int(b[j]) != 0:
                c += str(int(b[j]) % 2)
                b[j] = str(int(b[j]) // 2)
            else:
                c += '0'
        d.append(c[::-1])
        c = ''
    else:  # 输入的不是十六进制数字就是错误的
        print('输入错误')
# print(d) 对上面的二进制数字进行返回
f = ''
zero = '0'  # 由于一位十六进制分割后会是四位二进制数字,而八进制是三位二进制数字,所以我们需要在前面补0
for i in d:  # 进入列表,将列表的每个二进制数字放到一个字符串里进行判断
    f += i  # 添加
while len(f) % 3 != 0:  # 三位,所以对于3求余,余数为0就会停止加入0
    zero += f
    f = zero
    zero = '0'
list2 = []  # 放置八进制数字
m = ''  
num = 0
for i in range(len(f) // 3):    # 循环,每次抓取三个二进制数字放入到list2的列表中
    for j in range(3):  # 3次
        m += f[num]  # 加入
        num += 1  # +1
    list2.append(m)  # 添加 
    m = ''  # 循环结束,变回原样准备下一次
# print(list2) 测试
for i in list2:  # 进入每个都是三位的二进制数字中
    x = 0   # 进行一个较为简单的转换
    for j in range(1):  # 进行一次三个判断
        if i[j] == '1':
            x += 4
        if i[j + 1] == '1':
            x += 2
        if i[j + 2] == '1':
            x += 1
    m += str(x)  # 加入到m
if m[0] == '0':  # 第一位不可以为0,因为有些分割后变成000,001这种
    m = m[1:]
print(m)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值