【问题标题】:Need a little more help converting a CRC function from VB.NET to C#需要更多帮助将 CRC 函数从 VB.NET 转换为 C#
【发布时间】:2009-07-24 19:28:47
【问题描述】:

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

第二个错误

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

private static string getCRC(string input, bool appendDate)
{
    string toEnc = string.Format("{0}{1}", input, appendDate == true ? string.Format("{0:yyyyMMdd}", System.DateTime.Now) : "");
    System.IO.MemoryStream mStream = new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(toEnc), false);
    
    CRC32 oCRC = new CRC32();
    return oCRC.GetCrc32(((System.IO.Stream)mStream)).ToString();
}

返回线上有错误:

编译器错误消息: 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);

}

如您所见,我尝试将内存流转换为流,但我认为它不太喜欢。

第一个错误

(solved here)

如果您还没有看到我的最后几个问题,我有一个用 VB.NET 编写的 CRC 函数。我使用在线转换器将其转换为 C#。这是原始的VB代码:

Public Sub New()
    Dim dwPolynomial As UInt32 = 3988292384
    Dim i As Integer, j As Integer

    ReDim crc32Table(256)
    Dim dwCrc As UInt32

    For i = 0 To 255
        dwCrc = i
        For j = 8 To 1 Step -1
            If (dwCrc And 1) Then
                dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
                dwCrc = dwCrc Xor dwPolynomial
            Else
                dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
            End If
        Next j
        crc32Table(i) = dwCrc
    Next i
End Sub

这是我转换后的代码。我修复了一些我遇到的错误,但还有一些我无法弄清楚:

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;
    }
}

第一个错误在这一行:

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

if ((dwCrc &amp; 1))

我应该将这两个值与不同的运算符进行比较吗?老实说,我不太清楚为什么 &amp; 运营商在那里。

谢谢。

【问题讨论】:

  • 您的 VB.NET 代码有错误。 ReDim crc32Table(256) 为您提供 25*7* 条目,但您只填写 256。转换搞砸了(正确的 C# 等效项是 new uint[257]),但实际上适合您的情况。 ;)

标签: c# code-conversion


【解决方案1】:

C# 中没有隐式整数到布尔转换。您必须与 0 明确比较:

if ((dwCrc & 1) != 0) ...

【讨论】:

    【解决方案2】:

    C# 不要假设 0 等于 false,而 1 等于 true。

    这样

    if ((dwCrc & 1) == 1) { }
    

    会是你需要的。

    【讨论】:

      【解决方案3】:

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

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

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

      public UInt32 GetCrc32(ref System.IO.Stream stream)
      

      变成

      public UInt32 GetCrc32(System.IO.Stream stream)
      

      我怀疑原始的 VB.NET 在不需要的地方有 ByRef - 我看不到您在任何地方重新分配 stream 的值。

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

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

      【讨论】:

        【解决方案4】:

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

        试试这个:

            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;
                }
            }
        

        【讨论】:

          【解决方案5】:

          该特定行是按位与 dwCrc 和 1,即 0x01。所以基本上,它检查 dwCrc 的最低有效位是 1,而不是 0。如果是,则结果为 1。如果不是,则结果为 0。在 VB 中,整数自动转换为布尔值(0 -> false ,其他一切-> true)。在 C# 中,您必须明确地将其与值进行比较

          if ((dwCrc & 1) != 0) ...
          

          (还请注意,可能需要 ( & 1),因为它只检查一个特定位。如果 dwCrc == 0x02,那么原始测试将失败,转换后的测试也会失败。所以做类似

          if(dwCrc != 0) ...
          

          可能是错误的,虽然一开始可能不是这样。)

          【讨论】:

            【解决方案6】:

            看起来很多这些回复都解决了您的第一个错误。您的第二个错误的问题是您的 GetCrc 方法期望流通过引用( ref 关键字)传递。

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

            (另外,您不需要演员表——MemoryStream 继承自 Stream)

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

            另一个考虑因素: 除非您打算更改哪些 strem mStream 引用,否则您不需要创建 byRef 参数。除非您打算为流赋值(stream = new stream,或 stream = null),否则从方法声明中完全删除 ref 关键字更正确。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-29
              • 1970-01-01
              • 2012-05-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多