![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
зашился в вычислениях CRC , полистал кучу литературы, пообращался [D3]
aha © (2008-01-02 23:14:00)по конференциям , вернулся опять к вам . Известен полином $18F57.Есть кусок программы на С+ .Не хватает ума переделать на дельфи. Проверенная мной сумма для строки GVHGRILN, которая приводится к ввиду $0F10B257 равна $68A4.Не совсем понятен алгоритм на языке написанном С+. Может кто нибудь подскажет ?
unsigned short owenCRC16(unsigned char* packet, size_t length)
{
size_t i, j;
unsigned short crc;
assert(packet);
crc = 0;
for (i = 0; i < length; ++i)
{
unsigned char b = packet[i];
for (j = 0; j < 8; ++j, b 8)) & 0x80)
{
crc
Германн (2008-01-04 03:15:00) [21]
> зашился в вычислениях CRC , полистал кучу литературы, пообращался
> [D3]
>
> aha (02.01.08 23:14)
>
> по конференциям , вернулся опять к вам . Известен полином
> $18F57.
А причём тут "полином"?
icWasya (2008-01-04 02:59:00) [22]например, если B = $80 и crc = 0, то
выражение
(ORD(B) xor (crc shr 8)) and $80
нулю не равно
aha (2008-01-03 21:59:00) [23]Ничего не понимаю как ж на С+ все работает . Переделал на дельфи
таким образом
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
begin
owenCRC16('GVHGRILN',8);//хочу вычислить контр. сумму след. строки
end;
function owenCRC16(packet: pchar; length: integer): word;
var
i,j:integer;
crc: word;
b: char;
begin
crc:= 0;
for i:=0 to Pred(length) do
begin
b:=packet[i];
FOR J:=1 TO 8 DO
begin
if (ORD(B) xor (crc shr 8)) and $80 <>0
then
begin
crc:= crc shl (1);
crc:= crc xor ($8F57);
end
else
crc:= crc shl (1);
end;
end;
result:= crc;
FORM1.CAPTION:=INTTOSTR(CRC);
end;
контр. сумма должна быть $68A4, а судя по строке
if (ORD(B) xor (crc shr 8)) and $80 <>0 - она всегда будет равна 0 и следовательно CRC тоже
где моя ошибка ??
aha (2008-01-03 09:24:00) [24]спасибо DVM
конечно надо еще перерабатывать , наверное
1.
var
i,j:integer;
//i: size_t;
//j: size_t;
2. assert(packet) не проходит у меня - никогда не пользовался функцией.
3. b:= b shl (1); b pchar не свдигается .
А в целом еще раз спасибо за уделенное внимание !!
DVM (2008-01-02 23:34:00) [25]
> aha
вот тебе тупой автоперевод
function owenCRC16(packet: pchar; length: size_t): word;
var
i: size_t;
j: size_t;
crc: word;
b: char;
begin
assert(packet);
crc:= 0;
for{while} i:=0 to Pred(length) { ++i}
do
begin
b:=packet[i];
while{for}
j:= 0;
{to} j<8
{;}
inc(j);
b:= b shl (1);
do
begin
if (b xor (crc shr 8)) and $80
then
begin
crc:= crc shl (1);
crc:= crc xor ($8F57);
end;
else
crc:= crc shl (1);
end;
end;
begin
result:= crc;
exit;
end;
end;
palva (2008-01-02 23:22:00) [26]Если программа нужна для дела, то проще не переделывать, а откомпилировать борландовским компилятором и вставить объектный файл в паскаль.
Если же вы хотите потренировать голову и пальцы, то спрашивайте, какие конструкции в программе непонятны. Здесь найдется кому ответить.