我可能应该把所有这些都放在一个问题中,对不起:(
好的,这应该是错误的结束(希望如此):
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);
}
正如你所看到的,我试图将内存流作为一个流进行转换,但我认为它不太喜欢它。
如果你还没有看过我的最后几个问题,我有一个用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 & 1))
我应该将这两个值与不同的运算符进行比较吗?我不太清楚为什么&
运营商是诚实的。
非常感谢。
答案 0 :(得分:7)
C#中没有隐式的整数到布尔转换。你必须比较0明显:
if ((dwCrc & 1) != 0) ...
答案 1 :(得分:2)
C#不假设0等于false,并且1等于true。
因此
if ((dwCrc & 1) == 1) { }
将是你需要的。
答案 2 :(得分: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();
答案 3 :(得分: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;
}
}
答案 4 :(得分:0)
该特定行是按位AND运算dwCrc和1,它只是0x01。所以基本上,它检查dwCrc的最低有效位是1,而不是0.如果是,则结果为1.如果不是,则结果为0.在VB中,整数自动转换为bools(0 - &gt; false,其他一切 - &gt; true)。在C#中,您必须将其与显式值进行比较
if ((dwCrc & 1) != 0) ...
(另请注意,大概需要(&amp; 1),因为它只检查一个特定的位。如果dwCrc == 0x02,那么原始测试将失败,转换后的那个也会失败。所以做类似的事情
if(dwCrc != 0) ...
会出错,虽然起初看起来可能不是这样。)
答案 5 :(得分:0)
看起来很多这些响应都解决了您的第一个错误。第二个错误的问题是你的GetCrc方法希望通过引用传递流(ref关键字)。
在C#中,如果方法通过引用定义参数,则在调用它时必须通过引用显式传递它。因此,在调用GetCrcMethod时添加ref关键字:
(另外,你不需要演员 - MemoryStream继承自Stream)
return oCrc.GetCrc32(ref mStream).ToString();
另一个考虑因素: 除非您计划更改哪个strem mStream引用,否则您不需要创建byRef参数。除非您计划为stream(stream = new stream或stream = null)赋值,否则从方法声明中完全删除ref关键字更为正确。