2013-11-21 68 views
2

代碼Furies已經將他們的惡意怒視轉移到了我身上,並且實現了由The Direct Project定義的「安全傳輸」。無論我們在內部使用DNS而不是LDAP來共享證書,我顯然需要設置前者來測試,這就是我被卡住的原因。顯然,X509證書需要在CERT記錄中使用一些按摩功能,並且我正在設法解決這個問題。Python:base64.b64decode()vs .decode?

我發現的最清晰的東西是Videntity's blog上的一個腳本,但沒有精通python,我正在碰到一個絆腳石。具體而言,該行崩潰:

decoded_clean_pk = clean_pk.decode('base64', strict) 

,因爲它似乎不喜歡(或者說,就知道了)什麼「嚴格」應該代表。我正在做一個半受教育的猜測,即該行應該解碼base64數據,但是我從幾年前Debian OpenSSL崩潰中瞭解到,盲目地使用與加密相關的代碼進行欺騙的原因是Bad Thing(TM)。

於是我打開SO傑出的蟒蛇書呆子問,如果該行可能會被此所替代(加上了相應的進口):

decoded_clean_pk = base64.b64decode(clean_pk) 

的腳本,變更後的運行,併產生正確─看看輸出,但我有足夠的直覺知道我不一定相信我的直覺。 :)

+0

我用*最後一個例子更新了答案!*;) –

回答

4

這條線應該已經工作,如果你會一直這樣調用:

decoded_clean_pk = clean_pk.decode('base64', 'strict') 

注意strict必須是一個string,否則Python解釋器將嘗試尋找一個名爲strict變量,如果它沒有找到它或者具有其他值:strict,ignorereplace,它可能會抱怨它。

看看這個代碼:

>>>b=base64.b64encode('hello world') 
>>>b.decode('base64') 
'hello world' 

>>>base64.b64decode(b) 
'hello world' 

兩個decodeb64decode.decode傳遞的base64參數字符串的工作原理相同。

區別在於str.decode會將一串字節作爲參數並根據您作爲第一個參數傳遞的encoding參數返回它的Unicode表示形式。在這種情況下,你告訴它處理一個bas64字符串,以便它可以正常工作。

要回答你的問題,無論是工作原理相同,但b64decode/encode旨在僅使用Base64編碼工作,併爲圖書館意識到str.decode可以處理多達編碼。

欲瞭解更多信息,請閱讀兩個文檔部分:decodeb64decode

UPDATE:其實,這也是我猜:)看看源代碼encodings/base64_codec.py這是decode()使用的最重要的例子:

def base64_decode(input,errors='strict'): 

    """ Decodes the object input and returns a tuple (output 
     object, length consumed). 

     input must be an object which provides the bf_getreadbuf 
     buffer slot. Python strings, buffer objects and memory 
     mapped files are examples of objects providing this slot. 

     errors defines the error handling to apply. It defaults to 
     'strict' handling which is the only currently supported 
     error handling for this codec. 

    """ 
    assert errors == 'strict' 
    output = base64.decodestring(input) 
    return (output, len(input)) 

正如你可以真正看到,它使用base64模塊來做到這一點:)

希望這可以澄清你的問題。

+0

謝謝!我很感激幫助。其中一天,我將不得不學習python的做事方式。 :) – GeminiDomino