2017-10-14 283 views
2

轉換了一些基地64所以我想程序(在Python 3不附帶任何條件)這個涼爽的項目,我發現。在Python

返回的36位數n爲以相反的順序鹼-64編號的6個字符的字符串表示,其中64個標號的順序是:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz- +

例如,

encode(0) → '000000' 

encode() → '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至64基礎?

最後,扭轉數字我已經找到了新的表現後,我以爲我會只是國防部10每個電源隔離每個單獨的數字,然後把他們重新走到一起倒退。

我應該如何去規劃呢?

謝謝!

+0

檢查'//'做了什麼。 –

+0

你的第二個代碼示例是做什麼的? –

+0

用'n'等於100來測試。 –

回答

2

下面是一些代碼,你想要做什麼。 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,, 68719476735): 
    print(i, encode(i)) 

輸出

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+ 
0 000000 
gR1iC9 
68719476735 ++++++ 

因爲我們有一個基礎,就是2的冪,替代工作

n, r = n // 64, n % 64 

是使用按位運算

n, r = n >> 64, n & 63 

這是稍快,但我想這並沒有太大的區別,而且前面的代碼更具可讀性。 OTOH,理解爲什麼按位版本產生正確的結果會很有用。

+0

我無法贊成,因爲我沒有足夠的代表,但非常感謝。 –

+0

我插入它並且工作;)再次感謝。現在我要花幾個小時來理解它! –

+0

所以現在我正在嘗試編寫這個程序的逆向代碼 - 一個解碼。我意識到我應該把'chr'改成'ord,'但還有什麼? –