Как да се изчисли контролната сума за файла
И това е възможно по-подробно?
модул 256 = х мод 256
За съжаление, аз не разбирам как да го направите, можете да кодирате?
Modulo 256 в този конкурс е да се игнорира прехвърлянето, можете да, разбира се, не, но просто по-ефективно използване на байта и blokrovat грешка препълване. Въпреки че самата операция не може да отнеме доста време, но тя може да се извършва на големи обеми от данни
Може ли да попитам какво е алгоритъм на КРС?
Възможно е, това намалява код за грешка (в превод), въз основа на по-сложен алгоритъм от сумиране на байта, съществуващ член на голям брой такива алгоритми, някои от тях признат стандарт.
Тя може да дойде до мястото, което искате да направите, защо, и то как besprdmetno.
Но въпросът имаш отговор за дълго време, добавете всички байтове на модула 256, в края ще получите шах.
CRC алгоритъм е метод за изчисляване на данните, подпис (КРС), което позволява на определена степен на вероятност да се определи точността на данните в техните възможни нарушения по време на предаването, съхранението.
Трябва да направите следното: промяна на моя програмен код, независимо дали директно редактиране на код или написването на програмата кръпка е проверка на кода за промяна, а ако това се случи просто да прекъсне програмата си преди началото на програмата.
Послепис ако по-склонни да се отговори, а след това ще се опитам да намеря отговор някъде.
Eugene_post (23.10.02 21:47)
Защита на деликатен въпрос, имаш ли нещо против, че ще се яви на изпит хапка, без да разбират как и какво мислите. Но във всеки случай, CRC-ефективно от CS
конст
CrcPolynominal = $ 04C11DB7;
// *******************************
// * Изчислява CRC32 с буфер *
// *******************************
функционира BufToCrc (конст Buf; граф: цяло число). longint;
Var
I. цяло число;
започвам
Резултат: = $ FFFFFFFF;
защото: = 0 до граф - 1 започвайте
Резултати: = CRC32 (Byte (TByteArray (Buf) [I]) Резултати);
приключи;
приключи;
// *******************************
// * Изчислете CRC32 с низ *
// *******************************
функционира StrToCrc (Стойност: низ). longint;
Var
I. цяло число;
започвам
Резултат: = $ FFFFFFFF;
за I: = 1 до Дължина (стойност) се започне
Резултати: = CRC32 (Byte (Стойност [I]), резултат);
приключи;
приключи;
За електроника (асемблер) - това е възможно да си представим една смяна регистър с кранове от бита са необходими (в X градуса), както и всички крановете и въвеждане на една последователност от битове добавени от "по модул 2" и бит на вмъкване по малко в регистър.
След като премине през общия брой в регистър и ще бъде подписване на съобщенията (КРС).
Този метод на екстраполира за обработка на мулти-малко.
За да се ускори изчисляването техники маси се използват в действителност.
Между другото, същите неделими полиноми се използват за генериране на псевдо-случайни числа.
> Eugene_post
Друг вариант
конст
CrcSeed = $ ffffffff;
функционира CRC32 (буфер Стрелката; .. конст BufLen DWORD. CRC DWORD). DWORD; асемблер;
ASM
тласък EDI
Mov EDI, EAX
Mov EAX, ЕСх
Mov ЕСх, EDX
и ЕСх, ЕСх
JZ @Exit
и Еди, EDI
JZ @Exit
Стартирайте:
XOR EDX, EDX
Mov дл, ал
СБР EAX, 8
XOR дл, [Еди]
XOR EAX, DWORD PTR [4 * EDX + crctable32]
вкл EDI
контур Стартирайте
@Exit:
поп EDI
приключи;
функция CrcStream (поток. TStream). DWORD;
Var
P. Стрелката;
С LongInt;
започвам
Резултат: = CrcSeed;
GetMem (Р, 8192);
опитвам
Stream.Position: = 0;
докато Stream.Position
Резултати: = CRC32 (Р, С, Резултати)
край
накрая
FreeMem (Р, 8192)
приключи;
Резултат: = Резултат XOR CrcSeed
приключи;
функция CrcFile (Конст FileName. низ). DWORD;
Var
Поток. TFileStream;
започвам
Поток: = TFileStream.Create (FileName, fmOpenRead + fmShareDenyNone);
опитвам
Резултат: = CrcStream (Stream)
накрая
Stream.Free
край
приключи;
Версия на масата е по-добре да се преведе изцяло Паскал алгоритмичен не е толкова лесно perevedesh
Да, това е табличен метод с генераторен полином
FUNCTION UpdC32 (октет: байт; CRC: LONGINT). LONGINT;
ЗАПОЧНЕТЕ
UpdC32: = crctabdu32 [байт (CRC XOR LONGINT (октет))] XOR ((CRC SHR 8) и $ 00FFFFFF)
END;
конст
CRC32_POLYNOMIAL = $ EDB88320;
Var
Ccitt32Table. масив [0..255] на longint;
функция crc32 (CRC longint; .. конст в байт). longint;
започвам
crc32: = (((CRC SHR 8) и $ 00FFFFFF) XOR (Ccitt32Table [(CRC XOR в) и $ FF]));
приключи;
процедура BuildCRCTable;
Var
И, Й, стойност. DWORD;
започвам
защото: = 0-255 направи
започвам
стойност: = I;
за к: = 1 направи 8 Downto
започвам
ако ((стойност и 1) <> 0), тогава
стойност: = (стойност SHR 1) XOR CRC32_POLYNOMIAL
още
стойност: = стойност SHR 1;
приключи;
Ccitt32Table [Ь]: = стойност;
край
приключи;
Това е и метод на масата, само на масата, се изчислява, не се съхраняват.
ROL AL, 1
RCL EDX, 1
JNC @ 2
При това се използват знамето на носене, и Паскал няма достъп до. Но всичко зависи от целите, аз само не ми харесва, е използването на монтажен команди, не толерантност като технологията на .NET