将Delphi BufferToHex函数转换为Python

将Delphi BufferToHex函数转换为Python,python,delphi,Python,Delphi,我只是在学习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

我只是在学习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
buf这里是我得到的elf散列,存储在Delphi longint中,然后BufSize是该longint的Delphi sizeOf(),到目前为止似乎返回4

如何使Python函数类似于BufferToHex函数,返回等效的输出?据我所知,python类型是不同的,并且没有返回相同的字节大小(它似乎返回16而不是4),当我处理ctypes时,仍然得到不同的数字


任何建议都将不胜感激。谢谢。

该函数只需将二进制转换为十六进制字符串。由于您的输入哈希是32位宽的,所以您需要的是:

'%08X' % hash
其中,hash是包含哈希值的int

因为我猜你是在一台小小的endian机器上,所以十六进制字节会颠倒过来。修正如下:

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)]))
def-ELFHash(键):
散列,x=0,0
对于范围内的i(len(key)):
哈希=(哈希>24)
散列&=~x
hashstr='%08X'%hash
返回“.join(范围(0,len(hashstr),2)]中的i反转([hashstr[i:i+2]))

您要求将Delphi哈希函数转换为Python,但实际上尚未显示Delphi哈希函数。我们所拥有的只是你对函数的评估,它决定了它是一个“Elf”散列。如果您遇到的问题是如何将缓冲区转换为十六进制,那么只需询问这个问题,并将散列内容保留在其中,因为它与用十六进制编写缓冲区无关。我更正了标题,但保留了另一个函数,因为我试图显示将传递到新函数中的内容。谢谢,谢谢。我甚至用sys.byteorder:)添加了一个endian检查
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)]))