0

私はPythonを学んでいます。事前にお詫び申し上げます。

文字列ハッシュを作成するDelphi関数があります。最初に文字列をELFハッシュ(??)に変換し、次にそれをHEX番号に変更します。

私は最初の部分を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では、16進値に変換する追加の手順が実行されます

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は、私が取得したelfハッシュであり、Delphi longintに格納されています。次に、BufSizeはそのlongintのDelphi sizeOf()であり、これまでのところ4を返すようです。

同等の出力を返すBufferToHex関数に似たPython関数を作成するにはどうすればよいですか?私が知る限り、Pythonのタイプは異なり、同じバイトサイズを返さない(4ではなく16を返すようです)。ctypesのものをいじったとき、私はまだ異なる数を取得していました。

アドバイスをいただければ幸いです。ありがとう。

4

1 に答える 1

1

その関数が行うのは、バイナリを16進文字列に変換することだけです。入力ハッシュは32ビット幅なので、必要なのはこれだけです。

'%08X' % hash

ここで、hashは、ハッシュされた値を含むintです。

あなたはリトルエンディアンのマシンを使用していると思いますので、これでは16進バイトが逆になります。このように修正します。

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)]))
于 2013-03-13T07:31:40.487 に答える