я, вероятно, следовало бы просто поставить все это в одном вопросе, жаль, что :(нужно немного больше помощи преобразующего функции CRC от VB.NET на 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();
}
Ошибка находится на обратной линии:
Compiler Сообщение об ошибке: 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);
}
Как вы можете видеть, я попытался использовать memystream как поток, но я не думаю, что это слишком понравилось.
Первая ошибка
Если вы не видели мою последнюю пару вопросов, у меня есть функция CRC, написанный на VB.NET. Я использовал онлайн-конвертер, чтобы преобразовать его в 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))
Должен ли я сравнивать эти два значения с другим оператором? Я не слишком уверен в том, почему оператор &
должен быть честным.
Спасибо.
Ваш код VB.NET имеет ошибку. ReDim crc32Table (256) дает вам записи 25 * 7 *, но вы заполняете только 256. Преобразование прикручивало его (правильный эквивалент C# был бы новым uint [257]), но на самом деле это правильно для вашего дела. ;) –