2011-10-22 81 views
2

我試圖使用python再從中提取一個文件的一些字符串,然後使用MD5ing東西 此字符串,如:散列非ASCII Python字符串

#MD5er.py 
    salt = extract_salt(file_foo) 
    print 'salt: %s' % salt 
    from md5 import md5 
    print 'hash: %s' % md5(salt).hexdigest() 

$蟒蛇MD5er

salt: \0001\072\206\277\354\107\134\061\361\076\150\047\010\124\200\315\100 
    hash: ce24166858853dfb12a86d7d602b0638 

但是,像這樣使用iPython:

In [40]: salt = '\0001\072\206\277\354\107\134\061\361\076\150\047\010\124\200\315\100' 

    In [41]: salt 
    Out[41]: "\x001:\x86\xbf\xecG\\1\xf1>h'\x08T\x80\[email protected]" 

    In [42]: print salt 
    1:���G\1�>hT��@ 

    In [43]: from md5 import md5 

    In [44]: md5(salt).hexdigest() 
    Out[44]: 'ebae47a953591f7448ff7079837fb534' 

任何線索爲什麼MD5在2種情況下有所不同? 以及爲什麼在ipython中,當我輸入變量名時,它以與原始字符串不同的格式顯示,而print()輸出是第三種格式!

提示:

In [53]: import sys 
    In [54]: sys.getdefaultencoding() 
    Out[54]: 'ascii' 
+0

在文件中實際反斜線? –

回答

4

在第一種情況中的字符串正是你看到打印的內容:

>>> salt = '\\0001\\072\\206\\277\\354\\107\\134\\061\\361\\076\\150\\047\\010\\ 
124\\200\\315\\100' 
>>> md5(salt).hexdigest() 
'ce24166858853dfb12a86d7d602b0638' 

注意我是如何逃過反斜槓保持數字被解釋爲八進制字節值。

在第一種情況中的字符串正是你看到打印的內容:

>>> salt = '\\0001\\072\\206\\277\\354\\107\\134\\061\\361\\076\\150\\047\\010\\ 
124\\200\\315\\100' 
>>> md5(salt).hexdigest() 
'ce24166858853dfb12a86d7d602b0638' 

注意我是如何逃過反斜槓保持數字被解釋爲八進制字節值。

編輯:

假設你想創建從八進制值在此列表中的字節串:

data = ['\\0001', '\\072', '\\206', '\\277', '\\354', '\\107', '\\134', 
     '\\061', '\\361', '\\076', '\\150', '\\047', '\\010', '\\124', 
     '\\200', '\\315', '\\100'] 

可以轉換爲整數,然後加入人物,但它是從什麼不同你有了IPython。第一個值是4位而不是3位。它應該被視爲'\ 0',後跟ASCII'1',還是應該被視爲'\ 1'?下面確實後者:

salt = ''.join(chr(int(d[1:], 8)) for d in data) 
print repr(salt) 
print md5(salt).hexdigest() 

輸出:

"\x01:\x86\xbf\xecG\\1\xf1>h'\x08T\x80\[email protected]" 
d2092426d1bd5bec1579c8b7ed9c73c2 
+0

謝謝eryksu,我構建字符串的列表如下: l = ['\\ 0001','\\ 072','\\ 206','\\ 277','\\ 354', '\\ 107','\\ 134','\\ 061','\\ 361','\\ 076','\\ 150','\\ 047','\\ 010','\' \ 124','\\ 200','\\ 315','\\ 100'] 我需要刪除轉義字符'\',並將所有元素連接到一個字符串,以便像我粘貼的原始字符。所以,我想: >>> L2 = [元件[1:用於在升元件] >>> N = '' >>>爲EL在L2: N + = EL 但我得到: In [117]:n Out [117]:'0001072206277354107134061361076150047010124200315100' wz不同的MD5 – Montaro

+0

對於'\\ 0001',是的,我需要'\\ 000'然後在轉換後注入'1'。 感謝eryksun,它工作:) – Montaro