There's no implicit integer-to-boolean conversion in C#. You have to compare against 0 explicity:
if ((dwCrc & 1) != 0) ...
There's no implicit integer-to-boolean conversion in C#. You have to compare against 0 explicity:
if ((dwCrc & 1) != 0) ...
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.
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.)
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;
}
}
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.
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();