- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我正在尝试(在没有字符串的 Python 3 中)我发现的这个很酷的项目。
将 36 位数字 n 的 6 个字符的字符串表示形式返回为倒序的 base-64 数字,其中 64 位数字的顺序为:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+
例如,
encode(0) → '000000'
encode(9876543210) → 'gR1iC9'
encode(68719476735) → '++++++'
我目前拥有的是:
def encode(n):
SYM = {'0': 0,
'1': 1,
'2': 2,
'3': 3,
'4': 4,
'5': 5,
'6': 6,
'7': 7,
'8': 8,
'9': 9,
'A': 10,
'B': 11,
'C': 12,
'D': 13,
'E': 14,
'F': 15,
'G': 16,
'H': 17,
'I': 18,
'J': 19,
'K': 20,
'L': 21,
'M': 22,
'N': 23,
'O': 24,
'P': 25,
'Q': 26,
'R': 27,
'S': 28,
'T': 29,
'U': 30,
'V': 31,
'W': 32,
'X': 33,
'Y': 34,
'Z': 35,
'a': 36,
'b': 37,
'c': 38,
'd': 39,
'e': 40,
'f': 41,
'g': 42,
'h': 43,
'i': 44,
'j': 45,
'k': 46,
'l': 47,
'm': 48,
'n': 49,
'o': 50,
'p': 51,
'q': 52,
'r': 53,
's': 54,
't': 55,
'u': 56,
'v': 57,
'w': 58,
'x': 59,
'y': 60,
'z': 61,
'-': 62,
'+': 63,}
但现在我不确定下一步该做什么。我不想使用字符串和连接等,我想使用模数和标准数论 + for
/while
/else
方法。
我的想法是定义
r1 = n % 63
r2 = r1 % 63
r3 = r2 % 63
r4 = r3 % 63
r5 = r4 % 63
r6 = r5 % 63
但我不确定从那里该做什么。
例如,我应该如何将 n 转换为 base 64?最后,为了在找到新表示后反转数字,我想我将修改 10 的每个幂以隔离每个单独的数字,然后以相反的顺序连接它们。但是,我不确定如何在 Python 中对此进行编程,因为我对这门语言还比较陌生。感谢所有帮助,谢谢。
最佳答案
这里有一些代码可以满足您的需求。 get_digit
函数使用一堆if...elif
测试将0 <= d < 64 中的整数d
转换为其对应的字符数字,然后使用标准的 chr
函数将该数字转换为实际字符。 encode
函数执行实际的余数计算,调用 get_digit
进行字符转换,并将结果保存到 out
列表中。我们在该列表后附加 '0'
个字符,使其长度为 6。
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 ++++++
由于我们使用的是 2 的幂,因此可以替代
n, r = n // 64, n % 64
就是使用位运算
n, r = n >> 64, n & 63
稍微快一点,但我想这在这里没有太大区别,而且前面的代码更具可读性。 OTOH,了解按位版本产生正确结果的原因可能很有用。
关于python - 努力在没有字符串的 Python 中将数字转换为 base 64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46739875/
我正在尝试为我的项目创建一些单元测试,经过大量挖掘之后,我发现了Effort,这个想法很棒,它模拟数据库而不是处理伪造的DBContext,顺便说一句,很难做到正确使用复杂的架构。 但是,我将用户的电
我正在尝试对某些响应 Entity Framework 数据库上下文的类进行单元测试。为了寻求帮助,我设法找到了一个名为 Effort 的库,它似乎有点旧,而且没有很好的文档记录,但它似乎可以工作,而
这两天,Auto-GPT 爆火 https://github.com/Torantulino/Auto-GPT 它是一款让最强语言模型GPT-4能够自主完成任务的模型,让整个AI圈疯
为什么会出现这个异常?这是错误吗? 我正在使用 EF 测试库 Effort 创建我的数据库的内存实例并遇到这个有趣的场景: 打开DbContext1 将项目添加到表(不保存) 关闭DbContext1
我是一名优秀的程序员,十分优秀!