![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]++в ссылках пробелы убрать в начале кто захочет посмотреть - не вставлялось иначе