Python 在base-64中将字符串转换为数字

Python 在base-64中将字符串转换为数字,python,string,base,number-theory,Python,String,Base,Number Theory,所以,我试图写一个程序来解码6个字符的base-64数字 以下是问题陈述: 返回由6个字符的字符串s以相反顺序表示为基数64的36位数字,其中64个数字的顺序为:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZABCEFGHIJKLMNOPQRSTUVWXYZ-+ i、 e 解码('000000')→ 0 解码('gR1iC9')→ 9876543210 解码('++')→ 68719476735 我想不带任何条件地做这件事 最简单的方法是创建以下函数的逆函数: def

所以,我试图写一个程序来解码6个字符的base-64数字

以下是问题陈述:

返回由6个字符的字符串s以相反顺序表示为基数64的36位数字,其中64个数字的顺序为:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZABCEFGHIJKLMNOPQRSTUVWXYZ-+

i、 e

解码('000000')→ 0

解码('gR1iC9')→ 9876543210

解码('++')→ 68719476735

我想不带任何条件地做这件事

最简单的方法是创建以下函数的逆函数:

def get_digit(d):
    ''' Convert a base 64 digit to the desired character '''
    if 0 <= d <= 9:
        # 0 - 9
        c = 48 + d
    elif 10 <= d <= 35:
        # A - Z
        c = 55 + d
    elif 36 <= d <= 61:
        # a - z
        c = 61 + d
    elif d == 62:
        # -
        c = 45
    elif d == 63:
        # +
        c = 43
    else:
        # We should never get here
        raise ValueError('Invalid digit for base 64: ' + str(d)) 
    return chr(c)

# Test `digit`
print(''.join([get_digit(d) for d in range(64)]))

def encode(n):
    ''' Convert integer n to base 64 '''
    out = []
    while n:
        n, r = n // 64, n % 64
        out.append(get_digit(r))
    while len(out) < 6:
        out.append('0')
    return ''.join(out)

# Test `encode`
for i in (0, 9876543210, 68719476735):
    print(i, encode(i))
这实际上是从第页的PM 2Ring开始的

如何编写此程序的逆程序

开始:

上述get_数字的倒数如下:

def inv_get_digit(c):

    if 0 <= c <= 9:
        d = ord(c) - 48
    elif 'A' <= c <= 'Z':
        d = ord(c) - 55
    elif 'a' <= c <= 'z'
        d = ord(c) - 61
    elif c == '+':
        d = 63
    elif c == '-':
        d = 62
    else:
        raise ValueError('Invalid Input' + str(c))
    return d


def decode(n):

    out = []
    while n:
        n, r= n % 10, n ** (6-len(str))
        out.append(get_digit(r))
    while len(out) < 10:
        out.append('0')
    return ''.join(out)
def inv_get_数字(c):

如果0这里有一个程序,它与一些新代码结合起来执行逆运算

您的
inv\u get\u digit
函数中有语法错误:您将冒号从
elif
行的末尾漏掉了。而且不需要执行str(c)
,因为
c
已经是一个字符串了

恐怕您的
解码功能没有多大意义。它应该接受一个字符串作为输入并返回一个整数。请参阅下面的工作版本

def get_digit(d):
    ''' Convert a base 64 digit to the desired character '''
    if 0 <= d <= 9:
        # 0 - 9
        c = 48 + d
    elif 10 <= d <= 35:
        # A - Z
        c = 55 + d
    elif 36 <= d <= 61:
        # a - z
        c = 61 + d
    elif d == 62:
        # -
        c = 45
    elif d == 63:
        # +
        c = 43
    else:
        # We should never get here
        raise ValueError('Invalid digit for base 64: ' + str(d)) 
    return chr(c)

print('Testing get_digit') 
digits = ''.join([get_digit(d) for d in range(64)])
print(digits)

def inv_get_digit(c):
    if '0' <= c <= '9':
        d = ord(c) - 48
    elif 'A' <= c <= 'Z':
        d = ord(c) - 55
    elif 'a' <= c <= 'z':
        d = ord(c) - 61
    elif c == '-':
        d = 62
    elif c == '+':
        d = 63
    else:
        raise ValueError('Invalid input: ' + c)
    return d

print('\nTesting inv_get_digit') 
nums = [inv_get_digit(c) for c in digits]
print(nums == list(range(64)))

def encode(n):
    ''' Convert integer n to base 64 '''
    out = []
    while n:
        n, r = n // 64, n % 64
        out.append(get_digit(r))
    while len(out) < 6:
        out.append('0')
    return ''.join(out)

print('\nTesting encode')
numdata = (0, 9876543210, 68719476735)
strdata = []
for i in numdata:
    s = encode(i)
    print(i, s)
    strdata.append(s)

def decode(s):
    out = []
    n = 0
    for c in reversed(s):
        d = inv_get_digit(c)
        n = 64 * n + d
    return n

print('\nTesting decode')
for s, oldn in zip(strdata, numdata):
    n = decode(s)
    print(s, n, n == oldn)
我想不带任何条件地做这件事

首先,你需要澄清这意味着什么。您提供的编码器使用以下字符串:

out.append('0')
return ''.join(out)
digits = ''.join([get_digit(d) for d in range(64)])
if '0' <= c <= '9':
elif 'A' <= c <= 'Z':
elif 'a' <= c <= 'z':
elif c == '-':
elif c == '+':
接受的解决方案会添加以下字符串:

out.append('0')
return ''.join(out)
digits = ''.join([get_digit(d) for d in range(64)])
if '0' <= c <= '9':
elif 'A' <= c <= 'Z':
elif 'a' <= c <= 'z':
elif c == '-':
elif c == '+':
编码为反基数64和零填充使程序复杂化,但不添加任何内容。我们通常期望“100”代表底部的平方,但这里不是

输出

> python3 test.py
Encode:
4096 001000
9876543210 gR1iC9
68719476735 ++++++

Decode:
001000 4096
gR1iC9 9876543210
++++++ 68719476735
> 

请试着自己写一些代码。正如我所说的,第一步是反转
获取数字,我给了你一个如何做的提示。我编辑了我的帖子以反映你的评论。我没有在评论中发布新代码,因为格式有偏差。除非这样更好?不,永远不要在注释中发布多行Python代码,因为缩进会丢失。但无论如何,你的代码属于问题本身,注释只是为了帮助你澄清和改进你的问题。你的
inv\u get\u digit
看起来不错,尽管我没有测试过,你需要修复缩进。现在试着写
decode
,如果你被卡住了,就把代码贴出来,并清楚地解释它的错误。好的,我写了(一次尝试)decode。我的问题在于行
n,r=n%10,n**(6-len(str))
,我知道这是错误的,但我不知道用什么替换它。还有一个问题,“in
”。join(out)
是什么意思?啊,再次感谢。一个简单的问题,为什么我们必须用“s”作为论据?@Justama数学家不必担心。我们可以调用
decode
的参数来解码我们喜欢的任何东西。我只是用了
s
,因为它是“string”的助记符,我懒得想出一个更有意义的名字类似地,我用
c
表示字符,用
d
表示数字。一般来说,使用更长、更具描述性的名称是一个好主意,但当发生的事情显而易见时,使用短名称也可以。当然,对作者来说显而易见的东西未必总是对读者来说显而易见
> python3 test.py
Encode:
4096 001000
9876543210 gR1iC9
68719476735 ++++++

Decode:
001000 4096
gR1iC9 9876543210
++++++ 68719476735
>