Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.12.06;
Скачать: CL | DM;

Вниз

crc   Найти похожие ветки 

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

Требуется расчет 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-16 04:18) [1]

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


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

++

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

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


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

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


 
Rouse_ ©   (2014-06-19 18:58) [4]

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


 
Rouse_ ©   (2014-06-19 19:40) [5]

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


 
brother ©   (2014-06-19 20:59) [6]

зы. судя по скрину, очень сильно напоминает, оформление как рекомендовалось в http://delphimaster.net/view/1-1401910050/


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

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 байт на символ)


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

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


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

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


 
Rouse_ ©   (2014-06-20 12:27) [10]


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

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


 
DVM ©   (2014-06-20 13:12) [11]

На картинке правильно посчитана 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 но там вычисления табличные. Хотя переделать не сложно.


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

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


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

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


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

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

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


 
DVM ©   (2014-06-20 17:08) [15]


> nokia4ever   (20.06.14 16:22) [14]

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


 
DVM ©   (2014-06-20 17:12) [16]

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2015.12.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
15-1428355804
Юрий
2015-04-07 00:30
2015.12.06
С днем рождения ! 7 апреля 2015 вторник


2-1402877839
nokia4ever
2014-06-16 04:17
2015.12.06
crc


15-1429047002
Юрий
2015-04-15 00:30
2015.12.06
С днем рождения ! 15 апреля 2015 среда


15-1428065850
БарЛог
2015-04-03 15:57
2015.12.06
Электрика для дома. Так получилось.


15-1428528989
Кто б сомневался
2015-04-09 00:36
2015.12.06
Как такие ярлыки делать?: MyProgram://MyID