Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Delphi ELF-32哈希算法到C的转换#_C#_Delphi_Hash - Fatal编程技术网

C# Delphi ELF-32哈希算法到C的转换#

C# Delphi ELF-32哈希算法到C的转换#,c#,delphi,hash,C#,Delphi,Hash,我有一个Delphi函数要转换成C#。我找到了C#ELF-32示例,它似乎与Delphi中的一样工作,但我对返回的类型有疑问 以下是Delphi函数/过程(结果在摘要中,Buf是要散列的字符串…): 类型 TByteArray=字节的数组[0..32767]; 过程HashELF(变量摘要:LongInt;常量Buf;BufSize:LongInt); 变量 一、 X:长型; 开始 摘要:=0; 对于I:=0到BufSize-1,请开始 摘要:=(摘要shl 4)+TByteArray(Buf)

我有一个Delphi函数要转换成C#。我找到了C#ELF-32示例,它似乎与Delphi中的一样工作,但我对返回的类型有疑问

以下是Delphi函数/过程(结果在摘要中,Buf是要散列的字符串…):

类型
TByteArray=字节的数组[0..32767];
过程HashELF(变量摘要:LongInt;常量Buf;BufSize:LongInt);
变量
一、 X:长型;
开始
摘要:=0;
对于I:=0到BufSize-1,请开始
摘要:=(摘要shl 4)+TByteArray(Buf)[I];{!!.01}
X:=摘要和F0000000美元;
如果(x0)那么
摘要:=摘要xor(X shr 24);
摘要:=摘要和(不是X);
终止
终止
过程StringHashELF(变量摘要:LongInt;常量Str:string);
开始
HashELF(摘要,Str[1],长度(Str));
终止
函数MyHashELF(缓冲区:字符串):LongInt;
变量
小精灵:长;
开始
StringHashELF(elf摘要,缓冲区);
结果:=ELF;
终止
“返回值”为LONGINT类型(–2147483648至2147483647)

我在网上找到了一些C语言的等价物#

private static UInt32 MyHashELF(字符串缓冲区)
{
UInt32散列=0;
for(int i=0;i24);
散列&=~工作;
}
返回散列;
}
但是返回类型是Uint32(0到4294967295),如果我想在Int32中更改Uint32,我有以下错误(在0xf000000上):

无法将常量值“4026531840”转换为“int”(使用 要覆盖的“未选中”语法)

我做了一些测试,目前它的工作原理与Delphi相同,但我认为可能由于类型差异而存在潜在的错误(否?)。我要做什么才能与Delphi代码100%兼容

另外,在进一步的处理中,我需要使用这4个返回的字节作为字符串(一种键)的一部分


谢谢,4字节的结果将是相同的。Delphi longint和C#UInt32之间的区别在于它如何解释这4个字节:就好像它是有符号(longint)或无符号(UInt32)整数值一样

因此,如果您真的只需要变量verbatim下面的4个字节,您可以使用C代码,就像现在一样

如果将这4个字节存储在其数字表示形式中的某个位置,则必须稍微更改C#实现,使其与Delphi函数返回的数值兼容。C#编译器更喜欢用十六进制表示的常量的无符号值,因此您需要告诉它应该将其视为有符号。只需按照编译器的建议执行(添加unchecked以覆盖)。将行更改为:

Int32 work = (hash & unchecked((Int32)0xf0000000));
(当然,所有其他UInt32引用都应更改为Int32)。
那应该行。

谢谢。我想这正是我需要的。
private static UInt32 MyHashELF(string buffer)
{
    UInt32 hash = 0;
    for (int i = 0; i < buffer.Length; i++)
    {
        hash = (hash << 4) + (byte)buffer[i];
        UInt32 work = (hash & 0xf0000000);
        if (work != 0)
            hash ^= (work >> 24);
        hash &= ~work;
    }
    return hash;
}
Int32 work = (hash & unchecked((Int32)0xf0000000));