C# 需要更多帮助将CRC函数从VB.NET转换为C吗#
我可能应该把这一切都放在一个问题上,很抱歉:( 第二个错误 好的,这应该是错误的结束(希望如此): 返回行中出现错误: 编译器错误消息:CS1502:与“CRC.CRC32.GetCrc32(ref System.IO.Stream)”匹配的最佳重载方法具有一些无效参数 以下是它所指的功能: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
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();