2009-07-24 2 views
2

я, вероятно, следовало бы просто поставить все это в одном вопросе, жаль, что :(нужно немного больше помощи преобразующего функции 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 как поток, но я не думаю, что это слишком понравилось.

Первая ошибка

(solved here)

Если вы не видели мою последнюю пару вопросов, у меня есть функция 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))

Должен ли я сравнивать эти два значения с другим оператором? Я не слишком уверен в том, почему оператор & должен быть честным.

Спасибо.

+0

Ваш код VB.NET имеет ошибку. ReDim crc32Table (256) дает вам записи 25 * 7 *, но вы заполняете только 256. Преобразование прикручивало его (правильный эквивалент C# был бы новым uint [257]), но на самом деле это правильно для вашего дела. ;) –

ответ

7

В C# нет неявного целочисленного-булево преобразования. Вы должны сравнить с 0 explicity:

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

C# не предполагают, что 0 равно false, а 1 равно true.

Таким образом

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

бы быть то, что вам нужно.

+0

VB.NET преобразует! = 0 верно .... тонко отличается –

0

Эта конкретная строка является побитовым AND и dwCrc и 1, которая равна 0x01. Таким образом, в основном, он проверяет, что младший значащий бит dwCrc равен 1, а не 0. Если это так, результат будет равен 1. Если нет, то результат равен 0.В VB целые числа автоматически преобразуются в bools (0 -> false, все остальное -> true). В C#, вы должны сравнить его со значением, явно

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

(Заметим также, что (& 1) предположительно необходимы, так как проверка только одного определенного бита. Если dwCrc == 0x02, то оригинальный тест потерпит неудачу, как будет преобразованный один. так что делать что-то вроде

if(dwCrc != 0) ... 

бы неправильно, хотя это может показаться не так в первую очередь.)

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; 
     } 
    } 
0

Похоже, что многие из этих ответов адрес вашей первой ошибки. Проблема с вашей второй ошибкой заключается в том, что ваш метод GetCrc ожидает, что поток будет передан по ссылке (ключевое слово ref).

В C#. Если метод определяет параметр по ссылке, вы должны явно передать его по ссылке, когда вы его вызываете. Так что добавьте реф ключевое слово при вызове GetCrcMethod:

(также, что вам не нужно бросание - MemoryStream наследует от потока)

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

Еще одно соображение: Если вы не планируете изменить который strem mStream, вам не нужно указывать параметр byRef. Если вы не планируете присвоить значение потоку (stream = new stream или stream = null), правильнее всего просто удалить ключевое слово ref из объявления метода.

2

Для вашей 2-й задачи (которые получил бы больше трафика, если вы разместили ее в качестве 2-я вопроса):

Лучших перегружен матч метода «CRC.CRC32.GetCrc32 (иого System.IO.Stream)»имеет некоторые недопустимые аргументы

Удалить модификатор ref на C# код:

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

становится

public UInt32 GetCrc32(System.IO.Stream stream) 

Я подозреваю, что оригинальный VB.NET был ByRef, где не надо было - я не вижу вас переназначение значения stream в любом месте.

В качестве альтернативы, назовем его с реф параметра:

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

 Смежные вопросы

  • Нет связанных вопросов^_^