Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

crc


nokia4ever ©   (2014-06-16 04:17:00) 

Требуется расчет crc32 с применением полинома и без таблиц.

Полиномы для crc32 (на wiki есть)
CRC-32-IEEE 802.3
0x04C11DB7 / 0xEDB88320 / 0x82608EDB

Хорошее описание по проблеме нашлось тут http : / / www.miscel.dk/MiscEl/CRCcalculations.html
+ тут програмка для сверки http : / / www.miscel.dk/MiscEl/miscelCRCandChecksum.html
(еще проверялось на hashtab и Fsum frontend 1.5)

{для CRC32:
The following polynomial are used:
Normal Inverted/reversed/reflected
$04C11DB7 $EDB88320 Std. }

//CRC32 bit, normal
function crc32(Buffer:String;Polynom,Initial:Cardinal):Cardinal;
var i,j: Integer;
begin
Result:=Initial;
for i:=1 to Length(Buffer) do begin
 Result:=Result xor (ord(buffer[i]) shl 24);
 for j:=0 to 7 do begin
   if (Result and $80000000)<>0 then Result:=(Result shl 1) xor Polynom
   else Result:=Result shl 1;
   end;
 end;
end;

Переделываю под себя (d'xe6)

Function Crc32(Const Buffer:PByte;Const Size,Polynom,Initial:Cardinal):Cardinal; // crc32 bit, normal
var j:Cardinal;i:Byte;
begin
Result:=Initial;If Size=0 Then Exit;
for j:=0 to size-1 do begin Result:=Result xor (buffer[j] shl 24);
for i:=0 to 7 do if (Result and $80000000)<>0 then Result:=(Result shl 1) xor Polynom else Result:=Result shl 1;
end;
//Result:=Result and $ffffffff; // вроде как в конце должно быть?
//Result:=not Result; // вроде как результат должен инвертировать?
end;

применяю

...
var p,i,it:cardinal;sa:ansistring;pd:pbyte;
begin
sa:='123456789'; //'hello word';
i:=length(sa);
getmem(pd,i);
move(sa[1],pd^,i);
p:=$04C11DB7; // полином
it:=$FFFFFFFF; // начальное значение
showmessage(inttohex(crc32(pd,i,p,it),8));
freemem(pd,i);
end;

для ansi строки "123456789" crc32=CBF43926
я получаю $0376E6E7
если отремить результы, то $FC891918
где ошибка?


nokia4ever   (2014-06-21 05:22:00) [1]

Удалено модератором
Примечание: Создание пустых сообщений


nokia4ever   (2014-06-21 01:54:00) [2]

ansi chr(3)
пока. инфы достаточно пока. если что - спрошу еще ;)


DVM   (2014-06-20 17:12:00) [3]

вот все на русском разжевано http://www.rsdn.ru/article/files/classes/SelfCheck/crcguide.pdf


DVM   (2014-06-20 17:08:00) [4]


> nokia4ever   (20.06.14 16:22) [14]

там в файле есть некоторые комментарии на этот счет в его шапке


nokia4ever   (2014-06-20 16:22:00) [5]

++
кстати не могли бы пояснить:

RefIn : True
RefOut : True
XorOut : FFFFFFFF - вот это значит, что конечный результат xor+ff..ff, а первые два так понимаю "переворачивание" входных и выходных данных? что под этим кроется и как это реализовывается? это все байты с другого конца читаются или речь про биты идет? если можно то с примером небольшим.


nokia4ever   (2014-06-20 16:17:00) [6]

спасибо, вечером посмотрю


DVM   (2014-06-20 13:20:00) [7]

Кавычки там не надо учитывать, кстати


DVM   (2014-06-20 13:12:00) [8]

На картинке правильно посчитана CRC. Это вариант CRC32 для BZIP. Из моего юнита:
////////////////////////////////////////////////////////////////////////////////
//   Name   : "CRC-32/BZIP2"
//   Alias  : "B-CRC-32"
//   Alias  : "CRC-32/AAL5"
//   Alias  : "CRC-32/DECT-B"
//   Width  : 32
//   Poly   : 04C11DB7
//   Init   : FFFFFFFF
//   RefIn  : False
//   RefOut : False
//   XorOut : FFFFFFFF
//   Check  : FC891918
////////////////////////////////////////////////////////////////////////////////

Сам юнит https://yadi.sk/d/OtktzFO4UCpCS но там вычисления табличные. Хотя переделать не сложно.


Rouse_   (2014-06-20 12:27:00) [9]


> вы наверное считаете от строки (string=UnicodeString(WideString),
>  2 байта на символ) а не от ансистроки (string=ansistring,
>  1 байт на символ)

Я считал от анси строки, собственно и не я один, можешь проверить вот тут: http://crc32.ru/


nokia4ever   (2014-06-20 09:42:00) [10]

http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4


nokia4ever   (2014-06-20 09:41:00) [11]

или полином не тот


nokia4ever   (2014-06-20 09:40:00) [12]

2 Rouse_ [4]
нет спасибо, нужен pas

2 Rouse_ [5]
считает правильно, если галки слева включены. а когда выключены - это промежуточный результат (с которым совпадает рез.то что выше, правда с другим полиномом).

и ваша crc неверна. посмотрите даже на вики (на поиск crc там) есть проверочные суммы

Name : CRC 32
Width : 32
 Poly : 04C11DB7
 Init : FFFFFFFF
RefIn : True
RefOut : True
XorOut : FFFFFFFF
Check : CBF43926

вы наверное считаете от строки (string=UnicodeString(WideString), 2 байта на символ) а не от ансистроки (string=ansistring, 1 байт на символ)


brother   (2014-06-19 20:59:00) [13]

зы. судя по скрину, очень сильно напоминает, оформление как рекомендовалось в http://www.delphimaster.ru/cgi-bin/forum.pl?n=0&id=1401910050


Rouse_   (2014-06-19 19:40:00) [14]

Кстати по поводу картинки, он не правильно считает.
Контрольная сумма от этой строки "123456789" - с учетом кавычек и стандартного полинома $EDB88320 будет $83593021, а он показывает $2BC0589F.


Rouse_   (2014-06-19 18:58:00) [15]

У меня есть реализация, но на ассемблере, если подойдет могу дать...


rumma   (2014-06-19 09:54:00) [16]

ну что, нет идей?


nokia4ever   (2014-06-16 04:26:00) [17]

++

http://i63.fastpic.ru/big/2014/0616/52/5ef5aba01b6abe69b39d13062fcf1952.png

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


nokia4ever   (2014-06-16 04:18:00) [18]

++в ссылках пробелы убрать в начале кто захочет посмотреть - не вставлялось иначе


Наверх

Титульная страница Поиск, карта сайта Написать письмо