+7  A: 

There's no implicit integer-to-boolean conversion in C#. You have to compare against 0 explicity:

if ((dwCrc & 1) != 0) ...
Pavel Minaev
+2  A: 

C# do not assume that 0 is equal false, and that 1 is equal true.

Thus

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

Would be what you need.

Claus Jørgensen
VB.NET converts != 0 is true....subtly different
Mark Brackett
A: 

That particular line is bitwise-ANDing dwCrc and 1, which is just 0x01. So basically, it's checking that dwCrc's least significant bit is a 1, not a 0. If it is, the result will be 1. If not, the result is 0. In VB, integers are converted to bools automatically (0 -> false, everything else -> true). In C#, you have to compare it with a value explicitly

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

(Also note that the ( & 1) is presumably needed, since it is checking for only one particular bit. If dwCrc == 0x02, then the original test will fail, as will the converted one. So doing something like

if(dwCrc != 0) ...

would be wrong, although it may not seem so at first.)

Sean Nyman
+1  A: 

With the help of ReSharper I got your converted code to compile.

Try this out:

 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;
  }
 }
Paul Sasik
A: 

Looks like a lot of these responses address your first error. The problem with your second error is that your GetCrc method expects the stream to be passed by reference (the ref keyword).

In C#, If the method defines a parameter by reference, you have to explicitly pass it by reference when you call it. So add the ref keyword when you call your GetCrcMethod:

(also, you don't need the cast -- MemoryStream inherits from Stream)

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

One other consideration: Unless you plan to change which strem mStream references, you don't need to make a byRef parameter. Unless you plan to assign a value to stream (stream = new stream, or stream = null), it is more correct to just remove the ref keyword from the method declaration altogether.

JMarsch
+2  A: 

For your 2nd problem (which would have gotten more traffic if you posted it as a 2nd question):

The best overloaded method match for 'CRC.CRC32.GetCrc32(ref System.IO.Stream)' has some invalid arguments

Remove the ref modifier on the C# code:

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

becomes

public UInt32 GetCrc32(System.IO.Stream stream)

I suspect the original VB.NET had ByRef where it wasn't necessary - I don't see you reassigning the value of stream anywhere.

Alternatively, call it with a ref parameter:

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