2013-03-13 44 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