gpt4 book ai didi

python - 从字符串转换为 base-64 中的数字

转载 作者:太空宇宙 更新时间:2023-11-04 04:57:20 24 4
gpt4 key购买 nike

因此,我正在尝试编写一个程序来解码 6 个字符的 base-64 数字。

这里是问题陈述:

Return the 36-bit number represented as a base-64 number in reverse order by the 6-character string s where the order of the 64 numerals is: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+

decode('000000') → 0

decode('gR1iC9') → 9876543210

decode('++++++') → 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))

输出

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+
0 000000
9876543210 gR1iC9
68719476735 ++++++

实际上来自 this 页面上的 PM 2Ring。

如何编写该程序的反函数?

开始:

get_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 = 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)

最佳答案

这是一个将 my old code 与一些新代码结合起来执行逆运算的程序。

inv_get_digit 函数中存在语法错误:您在 elif 行末尾遗漏了冒号。并且不需要执行 str(c),因为 c 已经是一个字符串。

恐怕您的decode 函数没有多大意义。它应该将字符串作为输入并返回一个整数。请查看下面的工作版本。

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)

输出

Testing get_digit
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+

Testing inv_get_digit
True

Testing encode
0 000000
9876543210 gR1iC9
68719476735 ++++++

Testing decode
000000 0 True
gR1iC9 9876543210 True
++++++ 68719476735 True

关于python - 从字符串转换为 base-64 中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46751441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com