2013-03-13 86 views
0

我剛剛學習Python。提前道歉。將Delphi的BufferToHex函數轉換爲Python

我有一個創建字符串哈希的Delphi函數。它首先將字符串轉換爲ELF哈希(??),然後將其更改爲十六進制數字。

我的第一部分在Python工作

def ELFHash(key): 
    hash = 0 
    x = 0 
    for i in range(len(key)): 
     hash = (hash << 4) + ord(key[i]) 
     x = hash & 0xF0000000 
     if x != 0: 
     hash ^= (x >> 24) 
     hash &= ~x 
    return hash 

在Delphi的額外步驟完成將它轉換爲十六進制值

function BufferToHex(const Buf; BufSize : Cardinal) : string; 
var 
    I  : LongInt; 
begin 
    Result := ''; 
    for I := 0 to BufSize - 1 do 
    Result := Result + IntToHex(TByteArray(Buf)[I], 2); 
end; 

BUF這裏是精靈哈希我有,存放在Delphi的longint中,然後BufSize是那個longint的Delphi sizeOf(),它迄今爲止似乎返回4.

我該如何製作一個類似於BufferToHex的Python函數在將返回一個等效的輸出?據我可以告訴python類型是不同的,並沒有返回相同的字節大小(它似乎返回16而不是4),當我與ctypes混在一起時,我仍然得到不同的數字。

任何意見表示讚賞。謝謝。

+0

你問到一個Delphi哈希函數轉換爲Python,但你有沒有實際顯示德爾福哈希功能。我們所有的就是你對功能的評估,它確定它是一個「精靈」散列。如果你遇到問題的部分是如何將緩衝區轉換爲十六進制,那麼只需*詢問*並將散列值留給它,因爲它與以十六進制寫入緩衝區無關。 – 2013-03-13 06:05:06

+0

好吧,我糾正了標題,但留下了另一個函數,因爲我試圖展示什麼會被傳遞到新函數中。謝謝 – user1232971 2013-03-13 06:23:16

回答

1

該函數的功能是將二進制轉換爲十六進制字符串。由於您的輸入哈希值是32個位寬,所有你需要的是這樣的:

'%08X' % hash 

其中散列是包含散列值的int值。

因爲我猜你是在一個小端機器上,所以這將使十六進制字節反轉。解決這個問題是這樣的:

hashstr = '%08X' % hash 
hashstr = "".join(reversed([hashstr[i:i+2] for i in range(0, len(hashstr), 2)])) 

把它放在一起,你有這樣的:

def ELFHash(key): 
    hash, x = 0, 0 
    for i in range(len(key)): 
     hash = (hash << 4) + ord(key[i]) 
     x = hash & 0xF0000000 
     if x != 0: 
      hash ^= (x >> 24) 
      hash &= ~x 
    hashstr = '%08X' % hash 
    return "".join(reversed([hashstr[i:i+2] for i in range(0, len(hashstr), 2)])) 
+0

完美,謝謝。我甚至添加了與sys.byteorder :)的endian檢查 – user1232971 2013-03-13 08:13:42