Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Операции побитового сдвига в VB 6.0 Добавлено: 07.06.06 12:09  

Автор вопроса:  Selek
Доброго времени суток!
имеется некое устр-во работающее через компорт.Для отсылки комманд необходимо вычислить контр.сумму.
Возникли проблеммы с переводом на VB функций побитового сдвига.

Вот примеры вычисления контр. суммы.

Не могли бы вы помочь осилить этот перевод?))

Example of CCNET CRC calculation using C-language source code:

#define POLYNOMIAL 0x08408

unsigned int GetCRC16(unsigned char* bufData, unsigned int sizeData)
{
  unsigned int TmpCRC, CRC, i;
  unsigned char j;
  CRC = 0;
  for(i=0; i < sizeData; i++)
   {
    TmpCRC = CRC ^ bufData;
    for(j=0; j < 8; j++)
     {
      if(TmpCRC & 0x0001) {TmpCRC >>= 1; TmpCRC ^= POLYNOMIAL;}
      else TmpCRC >>= 1;
     }
   }
  return CRC;
}

Example of CCNET CRC calculation using PASCAL-language source code:

const _CR_CCNET_CRC_POLY = $08408

function GetCRC16(InData: array of byte; DataLng: word): word;
var i,TmpCRC: word;
    j: byte;
begin
result:=0;
for i:=0 to (DataLng-1) do
 begin
  TmpCRC:=result xor InData;
  for j:=0 to 7 do
   begin
    if (TmpCRC and $0001)<>0 then
     begin
      TmpCRC:=TmpCRC shr 1;
      TmpCRC:=TmpCRC xor _CR_CCNET_CRC_POLY;
     end
else
     TmpCRC:=TmpCRC shr 1;
   end;
  result:=TmpCRC;
 end;
end;

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 07.06.06 13:02
Правый побитовый сдвиг на один бит можно реализовать целочисленным делением на 2
TmpCRC = TmpCRC \ 2
if TmpCRC mod 2 = 1 then TmpCRC = TmpCRC xor &H8408

Ответить

Номер ответа: 2
Автор ответа:
 Selek



Вопросов: 2
Ответов: 5
 Профиль | | #2 Добавлено: 07.06.06 13:17
О! пасип!)))

Ответить

Номер ответа: 3
Автор ответа:
 Selek



Вопросов: 2
Ответов: 5
 Профиль | | #3 Добавлено: 07.06.06 15:12
Вот что у меня получилось... Но гадина ругается на InData(i). Пишет что тут должен быть массив. Что я нетак сделал???


Private Sub GetCRC16(ByVal InData As Byte, ByVal DataLen As Long)


Dim ccnet_crc_poly As Byte
 ;Dim i As Long
 ;Dim j As Byte
Dim tmpcrc As Byte
 ccnet_crc_poly = &H8408

  result = 0
  For i = 0 To (DataLen - 1)
  
    tmpcrc = result Xor InData(i) For j = 0 To 7
          If (result And &H1) <> 0 Then
      
        tmpcrc = tmpcrc \ 2
If tmpcrc Mod 2 = 1 Then tmpcrc = tmpcrc Xor &H8408
      Else
        tmpcrc = tmpcrc \ 2
        End If
     Next
        result = tmpcrc
  Next
End Sub

Ответить

Номер ответа: 4
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #4
Добавлено: 07.06.06 15:23

ByVal InData As Byte

ByVal InData() As Byte

Ответить

Номер ответа: 5
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #5
Добавлено: 07.06.06 15:23
Ой. не ByVal, а ByRef

Ответить

Номер ответа: 6
Автор ответа:
 Selek



Вопросов: 2
Ответов: 5
 Профиль | | #6 Добавлено: 07.06.06 15:49
Угумс!_)))))
Пасиб))) заработало)))

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам