Форум: "Начинающим";
Текущий архив: 2015.12.06;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.345 c