2009-07-24 82 views
2

我也许应该只是把这个都在同一个问题,对不起为:(需要多一点帮助,从VB.NET转换CRC功能,C#

二错误

好吧,这应该是错误的端部(希望):

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(参照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' 到 '布尔'

if ((dwCrc & 1))

我应该比较这两个值与不同的运算符?我不太确定为什么&运营商是诚实的。

谢谢。

+0

你的VB.NET代码有错误。 ReDim crc32Table(256)给你25 * 7 *的条目,但你只填写256.转换搞砸了(正确的C#相当于新的uint [257]),但实际上它适合你的情况。 ;) – 2009-07-24 20:17:01

回答

7

在C#中没有隐式的整数到布尔转换。你必须比较0显式:

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

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

因此

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

会是你所需要的。

+0

VB.NET转换!= 0是真的....微妙不同 – 2009-07-24 20:14:43

0

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

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

(另请注意,是大概需要(& 1),因为它是检查只有一个特定的位。如果dwCrc == 0×02,则原始的测试会失败,这将转换后的一个。所以做这样

if(dwCrc != 0) ... 

的东西是错误的,虽然它似乎没有可能那么在第一。)

1

随着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; 
     } 
    } 
0

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

在C#中,如果方法通过引用定义参数,则必须在调用它时通过引用显式传递它。所以加ref关键字,当你打电话给你GetCrcMethod:

(也,你不需要投 - MemoryStream的自Stream继承)

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

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

2

对于您的第二个问题(这会得到更多的流量,如果你张贴的第二个问题):

为“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();