Страница: 1 |
Страница: 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-сайт:
Профиль | | #1
Добавлено: 07.06.06 13:02
Правый побитовый сдвиг на один бит можно реализовать целочисленным делением на 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
 im i As Long
 im 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-сайт:
Профиль | | #4
Добавлено: 07.06.06 15:23
Номер ответа: 5
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #5
Добавлено: 07.06.06 15:23
Ой. не ByVal, а ByRef
Номер ответа: 6
Автор ответа:
Selek
Вопросов: 2
Ответов: 5
Профиль | | #6
Добавлено: 07.06.06 15:49
Угумс!_)))))
Пасиб))) заработало)))