C# 需要更多帮助将CRC函数从VB.NET转换为C吗#

C# 需要更多帮助将CRC函数从VB.NET转换为C吗#,c#,code-conversion,C#,Code Conversion,我可能应该把这一切都放在一个问题上,很抱歉:( 第二个错误 好的,这应该是错误的结束(希望如此): 返回行中出现错误: 编译器错误消息:CS1502:与“CRC.CRC32.GetCrc32(ref System.IO.Stream)”匹配的最佳重载方法具有一些无效参数 以下是它所指的功能: public UInt32 GetCrc32(ref System.IO.Stream stream) { //Dim crc32Result As Integer = &HFFFFFFFF

我可能应该把这一切都放在一个问题上,很抱歉:(

第二个错误 好的,这应该是错误的结束(希望如此):

返回行中出现错误:

编译器错误消息:CS1502:与“CRC.CRC32.GetCrc32(ref System.IO.Stream)”匹配的最佳重载方法具有一些无效参数

以下是它所指的功能:

public UInt32 GetCrc32(ref System.IO.Stream stream)
{
    //Dim crc32Result As Integer = &HFFFFFFFF
    UInt32 crc32Result = UInt32.MaxValue;

    try
    {

        byte[] buffer = new byte[BUFFER_SIZE];
        int readSize = BUFFER_SIZE;

        int count = stream.Read(buffer, 0, readSize);
        int i;
        UInt32 iLookup;
        //Dim tot As Integer = 0
        while ((count > 0))
        {
            for (i = 0; i <= count - 1; i++)
            {
                iLookup = (crc32Result & 0xff) ^ buffer[i];
                //crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And &HFFFFFF                     ' nasty shr 8 with vb :/
                crc32Result = ((UInt32)((crc32Result & 4294967040L) / 256) & UInt32.MaxValue);
                // nasty shr 8 with vb :/
                crc32Result = crc32Result ^ crc32Table[iLookup];
            }
            count = stream.Read(buffer, 0, readSize);
        }
    }
    catch (Exception ex)
    {
        HttpContext.Current.Response.Output.Write(string.Format("{0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace));
        System.Diagnostics.Debugger.Break();
    }

    return (~crc32Result);

}
这是我转换的代码。我修复了一些错误,但还有一些错误我无法解决:

public CRC32()
{
    UInt32 dwPolynomial = ((UInt32)3988292384L);
    int i;
    int j;

    UInt32[] crc32Table;
    crc32Table = new UInt32[256];
    UInt32 dwCrc;

    for (i = 0; i <= 255; i++)
    {
        dwCrc = ((UInt32)i);
        for (j = 8; j >= 1; j -= 1)
        {
            if ((dwCrc & 1))
            {
                dwCrc = ((dwCrc & 0xfffffffe) / 2L) & 0x7fffffff;
                dwCrc = dwCrc ^ dwPolynomial;
            }
            else
            {
                dwCrc = ((dwCrc & 0xfffffffe) / 2L) & 0x7fffffff;
            }
        }
        crc32Table[i] = dwCrc;
    }
}
公共CRC32()
{
UInt32 DW多项式=((UInt32)3988292384L);
int i;
int j;
UInt32[]CRC32表格;
CRC32表格=新UInt32[256];
UInt32 dwCrc;
对于(i=0;i=1;j-=1)
{
如果((dwCrc&1))
{
dwCrc=((dwCrc&0xFFFFFE)/2L)和0x7fffffff;
dwCrc=dwCrc^dwCrc多项式;
}
其他的
{
dwCrc=((dwCrc&0xFFFFFE)/2L)和0x7fffffff;
}
}
CRC32表[i]=dwCrc;
}
}
第一个错误在这一行:

编译器错误消息:CS0030:无法将类型“uint”转换为“bool”

if((dwCrc&1))

我应该用不同的运算符比较这两个值吗?老实说,我不太清楚为什么会有
&
运算符


非常感谢。

C#中没有隐式整数到布尔值的转换。您必须与0显式进行比较:

if ((dwCrc & 1) != 0) ...
C#不要假设0等于false,1等于true

因此


将是您需要的。

特定的行是按位ANDing dwCrc和1,它只是0x01。因此,基本上,它检查dwCrc的最低有效位是1,而不是0。如果是,结果将是1。如果不是,结果是0。在VB中,整数会自动转换为布尔值(0->false,其他所有内容->true).在C#中,必须显式地将其与值进行比较

if ((dwCrc & 1) != 0) ...
(还要注意,&1)可能是必需的,因为它只检查一个特定的位。如果dwCrc==0x02,那么原始测试将失败,转换后的测试也将失败

if(dwCrc != 0) ...
这可能是错误的,尽管一开始看起来可能不是这样。)

在我的帮助下,我得到了您转换后的代码进行编译

试试这个:

    public void CRC32()
    {
        UInt32 dwPolynomial = ((UInt32) 3988292384L);
        int i;
        int j;

        UInt32[] crc32Table;
        crc32Table = new UInt32[256];
        UInt32 dwCrc;

        for (i = 0; i <= 255; i++)
        {
            dwCrc = ((UInt32) i);
            for (j = 8; j >= 1; j -= 1)
            {
                if ((dwCrc & 1) != 0u)
                {
                    dwCrc = (uint) (((dwCrc & 0xfffffffe)/2L) & 0x7fffffff);
                    dwCrc = dwCrc ^ dwPolynomial;
                }
                else
                {
                    dwCrc = (uint) (((dwCrc & 0xfffffffe)/2L) & 0x7fffffff);
                }
            }

            crc32Table[i] = dwCrc;
        }
    }
public void CRC32()
{
UInt32 DW多项式=((UInt32)3988292384L);
int i;
int j;
UInt32[]CRC32表格;
CRC32表格=新UInt32[256];
UInt32 dwCrc;
对于(i=0;i=1;j-=1)
{
如果((dwCrc&1)!=0u)
{
dwCrc=(uint)((dwCrc&0xfffffffe)/2L)和0x7fffffff);
dwCrc=dwCrc^dwCrc多项式;
}
其他的
{
dwCrc=(uint)((dwCrc&0xfffffffe)/2L)和0x7fffffff);
}
}
CRC32表[i]=dwCrc;
}
}

看起来这些响应中有很多是针对第一个错误的。第二个错误的问题是GetCrc方法希望通过引用(ref关键字)传递流

在C#中,如果该方法通过引用定义参数,则在调用它时必须通过引用显式传递它。因此,在调用GetCrcMethod时添加ref关键字:

(另外,您不需要强制转换——MemoryStream继承自流)

另一个考虑: 除非您计划更改哪个strem mStream引用,否则不需要创建byRef参数。除非您计划为stream分配一个值(stream=new stream或stream=null),否则只需从方法声明中删除ref关键字就更正确了。

关于第二个问题(如果您将其作为第二个问题发布,将会获得更多流量):

与“CRC.CRC32.GetCrc32(ref System.IO.Stream)”匹配的最佳重载方法具有一些无效参数

删除C代码上的
ref
修饰符:

变成

public UInt32 GetCrc32(System.IO.Stream stream)
我怀疑最初的VB.NET在不需要ByRef的地方使用了ByRef—我没有看到您在任何地方重新分配
stream
的值

或者,使用ref参数调用它:

return oCRC.GetCrc32(ref mStream).ToString();

你的VB.NET代码有一个错误。ReDim crc32Table(256)给你25*7*个条目,但你只填了256。转换搞砸了(正确的C#等价物应该是新的uint[257]),但实际上它适合你的情况
    public void CRC32()
    {
        UInt32 dwPolynomial = ((UInt32) 3988292384L);
        int i;
        int j;

        UInt32[] crc32Table;
        crc32Table = new UInt32[256];
        UInt32 dwCrc;

        for (i = 0; i <= 255; i++)
        {
            dwCrc = ((UInt32) i);
            for (j = 8; j >= 1; j -= 1)
            {
                if ((dwCrc & 1) != 0u)
                {
                    dwCrc = (uint) (((dwCrc & 0xfffffffe)/2L) & 0x7fffffff);
                    dwCrc = dwCrc ^ dwPolynomial;
                }
                else
                {
                    dwCrc = (uint) (((dwCrc & 0xfffffffe)/2L) & 0x7fffffff);
                }
            }

            crc32Table[i] = dwCrc;
        }
    }
return oCrc.GetCrc32(ref mStream).ToString();
public UInt32 GetCrc32(ref System.IO.Stream stream)
public UInt32 GetCrc32(System.IO.Stream stream)
return oCRC.GetCrc32(ref mStream).ToString();