在编写信息隐藏技术的时候,需要用到进制转换,用到的思想很简单
M进制数 -> 十进制数 -> N进制数
在转换为N进制数时,需要考虑顺序是否反了
输入为数组的版本
# input:
# bl list类型的M进制数
# M 原进制
# N 目标进制
# output:
# res list类型的N进制数
def numMtoN_list(bl,m,n):
# to dec
dec = 0
for i in bl[::]:
dec *= m
dec += i
# to n-nary
res = []
while(dec != 0):
res.append(dec % n)
dec //= n
# 逆序
res = res[::-1]
return res
输入为数值的版本
# input:
# num int类型的M进制数
# M 原进制
# N 目标进制
# output:
# res int类型的N进制数
def numMtoN(num,m,n):
s = list(map(int,str(num)))
dec = 0
for i in s[::]:
dec *= m
dec += i
# dec to N
mid = 0
while(dec != 0):
mid *= 10
mid += (dec % n)
dec //= n
#逆序
res = 0
while(mid != 0):
res *= 10
res += (mid % 10)
mid //= 10
return res
利用partial生成任意进制转换函数
如果我们需要自己制定一个固定的进制转换,可以利用python自带的 partial 函数生成一个固定的进制转换函数
利用 functools 模块的 partial 函数,可以生成任意进制转换函数
import functools
# 生成5进制转2进制
num5to2_list = functools.partial(numMtoN_list,m=5,n=2)
输出结果
>>> data = [1,1,4]
>>> res = numMtoN_list(data,5,2)
# res = num5to2_list(data,5,2) # 效果相同
res = [1, 0, 0, 0, 1, 0]
>>> numMtoN(114,10,5)
424