Контрольная сумма по модулю 256

Контрольная сумма по модулю 256

Здравствуйте!
Господа мастера!

Подскажите как подсчитать контрольную сумму файла?


Anatoly Podgoretsky ( 2002-10-23 20:14 ) [1]

Сложить все байты по модулю 256


Eugene_post ( 2002-10-23 20:17 ) [2]

А можно по подробнее?


jack128 ( 2002-10-23 20:19 ) [3]

по модулю 256 = x mod 256


Eugene_post ( 2002-10-23 20:59 ) [4]

Сорри, я не понимаю как это сделать, можно код?


Anatoly Podgoretsky ( 2002-10-23 21:21 ) [5]

По модулю 256 в данном контесте означает игнорировать перенос, можно конечно и так, но эффективнее просто использовать байт и блокровать ошибку переполнения. Хотя сама операция не занимает много времени, но она может выполняться над большим массивом данных

Eugene_post (23.10.02 20:59)
Чего тут понимать, читать файл по байтно и суммировать все байты в переменной типа байт, как правило применять это требуется очень редко, эффективность такой проверки чрезвычайно низкая, для более качественной защиты использую как минимум какой нибудь алгоритм CRC


Eugene_post ( 2002-10-23 21:25 ) [6]

А можно спросить что такое алгоритм CRC?


Anatoly Podgoretsky ( 2002-10-23 21:37 ) [7]

Можно, это код уменьшающий ошибку (в переводе), основан на более сложном алгоритме, чем просто суммирования байтов, сущестует большое количество таких алгоритмом, ряд из них признан стандартными.
Может подойдем к сути, что ты хочешь сделать, зачем, а то как то беспрдметно.
Но свой вопрос ты уже давно получил ответ, суммируй все байты по модулю 256, по окончанию получишь контрольную сумму.


Jeer ( 2002-10-23 21:42 ) [8]

Алгоритм CRC это метод вычисления сигнатуры(контрольной суммы) данных, позволяющий с известной вероятностью определить достоверность данных при их возможных искажениях в процессе передачи, хранения..

На начальной стадии создания методов проверки достоверности данных назывался КОНТРОЛЬНАЯ СУММА (КС) или CHECK SUM (CS), затем, с усложнением алгоритмов, — Cyclic Redundancy Check (CRC).
Базируется на полиномиальной алгебре — исходная последовательность делиться на неприводимый полином выбранной структуры (полином с максимальным периодом)
Вот примеры полиномов
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035389740&n=0
x^32 + x^7 + x^5 + x^3 + x^2 + x + 1, 2^32 -1
x^40 + x^5 + x^4 + x^3 + 1, 2^40 -1
x^48 + x^7 + x^5 + x^4 + x^2 + x + 1, 2^48 -1

Читайте также:  Как удалить топ результат в сафари


Eugene_post ( 2002-10-23 21:47 ) [9]

Мне нужно сделать следующее: при изменении кода моей программы, будь то прямое редактирование кода или написание программы-патча, перед запуском моей программы шла проверка на изменение кода и если это произошло просто прерывать программу.

P.S. если неохота отвечать подробнее, то я сам попытаюсь найти где-нибудь ответ.


Ученик ( 2002-10-23 21:52 ) [10]

>Jeer © (23.10.02 21:42)
Если можно, проведите урок до конца, как это превращается в вычисление, например CRC-32 ?


Anatoly Podgoretsky ( 2002-10-23 22:08 ) [11]

Eugene_post (23.10.02 21:47)
Защита дело тонкое, учти что будут выкусывать проверку не разбираясь как и что ты считаешь. Но в любом случае CRC эффективнее чем CS

Ученик © (23.10.02 21:52)
Алгоритмов очень много, быстрые делаются по таблице, более медленные алгоритмическим путем, с помощью вычисления полинома
Вот мой старый алгоритм, наверно не эффективный, писался в 1996 году для Д2, советую поискать в FAQ и другие реализации, этот просто как пример.

const
CrcPolynominal = $04C11DB7;

//*******************************
//* Calculate Crc32 with buffer *
//*******************************
function BufToCrc(const Buf; Count:Integer) : Longint;
var
I : Integer;
begin
Result := $FFFFFFFF;
for I := 0 to Count — 1 do begin
Result := Crc32(Byte(TByteArray(Buf)[I]),Result);
end;
end;

//*******************************
//* Calculate Crc32 with string *
//*******************************
function StrToCrc(Value:string) : Longint;
var
I : Integer;
begin
Result := $FFFFFFFF;
for I := 1 to Length(Value) do begin
Result := Crc32(Byte(Value[I]),Result);
end;
end;


Jeer ( 2002-10-23 22:10 ) [12]

Места маловато будет :))
Тем более, что Инет позаботился о Вас..
http://embedded.ifmo.ru/embedded_old/ETC/REFERAT/crc/crc.htm

Для электронщиков(ассемблерщиков) — можно представить себе сдвиговый регистр с отводами от необходимых разрядов (при степенях Х) и все отводы и входная однобитная последовательность складываются по "модулю 2" и вводяться побитно в регистр.
После прохождения всего числа в регистре и окажется сигнатура (CRC).
Этот метод экстраполируется и на многобитную обработку.

Для ускорения вычисления реально используются табличные методы.


Jeer ( 2002-10-23 22:13 ) [13]

Кстати, те же неприводимые полиномы используются и для генерации псевдослучайных чисел.


Ученик ( 2002-10-23 22:28 ) [14]

Читайте также:  Замена дисплейного модуля iphone 7 plus

>Jeer © (23.10.02 22:10)
Большое спасибо .

>Eugene_post
Еще один вариант реализации

const
CrcSeed = $ffffffff;

const
crctable32 : array[0..255] of DWORD = (
$00000000,$77073096,$ee0e612c,$990951ba,$076dc419,$706af48f,
$e963a535,$9e6495a3,$0edb8832,$79dcb8a4,$e0d5e91e,$97d2d988,
$09b64c2b,$7eb17cbd,$e7b82d07,$90bf1d91,$1db71064,$6ab020f2,
$f3b97148,$84be41de,$1adad47d,$6ddde4eb,$f4d4b551,$83d385c7,
$136c9856,$646ba8c0,$fd62f97a,$8a65c9ec,$14015c4f,$63066cd9,
$fa0f3d63,$8d080df5,$3b6e20c8,$4c69105e,$d56041e4,$a2677172,
$3c03e4d1,$4b04d447,$d20d85fd,$a50ab56b,$35b5a8fa,$42b2986c,
$dbbbc9d6,$acbcf940,$32d86ce3,$45df5c75,$dcd60dcf,$abd13d59,
$26d930ac,$51de003a,$c8d75180,$bfd06116,$21b4f4b5,$56b3c423,
$cfba9599,$b8bda50f,$2802b89e,$5f058808,$c60cd9b2,$b10be924,
$2f6f7c87,$58684c11,$c1611dab,$b6662d3d,$76dc4190,$01db7106,
$98d220bc,$efd5102a,$71b18589,$06b6b51f,$9fbfe4a5,$e8b8d433,
$7807c9a2,$0f00f934,$9609a88e,$e10e9818,$7f6a0dbb,$086d3d2d,
$91646c97,$e6635c01,$6b6b51f4,$1c6c6162,$856530d8,$f262004e,
$6c0695ed,$1b01a57b,$8208f4c1,$f50fc457,$65b0d9c6,$12b7e950,
$8bbeb8ea,$fcb9887c,$62dd1ddf,$15da2d49,$8cd37cf3,$fbd44c65,
$4db26158,$3ab551ce,$a3bc0074,$d4bb30e2,$4adfa541,$3dd895d7,
$a4d1c46d,$d3d6f4fb,$4369e96a,$346ed9fc,$ad678846,$da60b8d0,
$44042d73,$33031de5,$aa0a4c5f,$dd0d7cc9,$5005713c,$270241aa,
$be0b1010,$c90c2086,$5768b525,$206f85b3,$b966d409,$ce61e49f,
$5edef90e,$29d9c998,$b0d09822,$c7d7a8b4,$59b33d17,$2eb40d81,
$b7bd5c3b,$c0ba6cad,$edb88320,$9abfb3b6,$03b6e20c,$74b1d29a,
$ead54739,$9dd277af,$04db2615,$73dc1683,$e3630b12,$94643b84,
$0d6d6a3e,$7a6a5aa8,$e40ecf0b,$9309ff9d,$0a00ae27,$7d079eb1,
$f00f9344,$8708a3d2,$1e01f268,$6906c2fe,$f762575d,$806567cb,
$196c3671,$6e6b06e7,$fed41b76,$89d32be0,$10da7a5a,$67dd4acc,
$f9b9df6f,$8ebeeff9,$17b7be43,$60b08ed5,$d6d6a3e8,$a1d1937e,
$38d8c2c4,$4fdff252,$d1bb67f1,$a6bc5767,$3fb506dd,$48b2364b,
$d80d2bda,$af0a1b4c,$36034af6,$41047a60,$df60efc3,$a867df55,
$316e8eef,$4669be79,$cb61b38c,$bc66831a,$256fd2a0,$5268e236,
$cc0c7795,$bb0b4703,$220216b9,$5505262f,$c5ba3bbe,$b2bd0b28,
$2bb45a92,$5cb36a04,$c2d7ffa7,$b5d0cf31,$2cd99e8b,$5bdeae1d,
$9b64c2b0,$ec63f226,$756aa39c,$026d930a,$9c0906a9,$eb0e363f,
$72076785,$05005713,$95bf4a82,$e2b87a14,$7bb12bae,$0cb61b38,
$92d28e9b,$e5d5be0d,$7cdcefb7,$0bdbdf21,$86d3d2d4,$f1d4e242,
$68ddb3f8,$1fda836e,$81be16cd,$f6b9265b,$6fb077e1,$18b74777,
$88085ae6,$ff0f6a70,$66063bca,$11010b5c,$8f659eff,$f862ae69,
$616bffd3,$166ccf45,$a00ae278,$d70dd2ee,$4e048354,$3903b3c2,
$a7672661,$d06016f7,$4969474d,$3e6e77db,$aed16a4a,$d9d65adc,
$40df0b66,$37d83bf0,$a9bcae53,$debb9ec5,$47b2cf7f,$30b5ffe9,
$bdbdf21c,$cabac28a,$53b39330,$24b4a3a6,$bad03605,$cdd70693,
$54de5729,$23d967bf,$b3667a2e,$c4614ab8,$5d681b02,$2a6f2b94,
$b40bbe37,$c30c8ea1,$5a05df1b,$2d02ef8d);

function Crc32(Buffer : Pointer; const BufLen : DWord; Crc : DWord) : DWORD; assembler;
asm
push edi
mov edi, eax
mov eax, ecx
mov ecx, edx
and ecx, ecx
jz @Exit
and edi, edi
jz @Exit
@Start:
xor edx, edx
mov dl, al
shr eax, 8
xor dl, [edi]
xor eax, dword ptr [4 * edx + crctable32]
inc edi
loop @Start
@Exit:
pop edi
end;

function CrcStream(Stream : TStream) : DWORD;
var
P : Pointer;
C : LongInt;
begin
Result := CrcSeed;
GetMem(P, 8192);
try
Stream.Position := 0;
while Stream.Position


Anatoly Podgoretsky ( 2002-10-23 22:36 ) [15]

Вариант с таблицей лучше полностью перевести на Паскаль, алгоритмический так просто не переведешь


Jeer ( 2002-10-23 22:39 ) [16]

Да, это табличный метод с порождающим полиномом

Copyright (C) 1986 Gary S. Brown
Converted to Turbo Pascal ™ V4.0 March, 1988 by J.R.Louvau

FUNCTION UpdC32(octet: BYTE; crc: LONGINT) : LONGINT;
BEGIN < UpdC32 >
UpdC32 := crctabду32[BYTE(crc XOR LONGINT(octet))] XOR ((crc SHR 8) AND $00FFFFFF)
END;


Ученик ( 2002-10-23 22:52 ) [17]

const
CRC32_POLYNOMIAL = $EDB88320;

var
Ccitt32Table : array[0..255] of longint;

function crc32(crc : longint; const c : byte) : longint;
begin
crc32 := (((crc shr 8) and $00FFFFFF) xor (Ccitt32Table[(crc xor c) and $FF]));
end;

procedure BuildCRCTable;
var
i, j, value : DWORD;
begin
for i := 0 to 255 do
begin
value := i;
for j := 8 downto 1 do
begin
if ((value and 1) <> 0) then
value := (value shr 1) xor CRC32_POLYNOMIAL
else
value := value shr 1;
end;
Ccitt32Table[i] := value;
end
end;


Jeer ( 2002-10-23 23:01 ) [18]

Ученик © (23.10.02 22:52)

Это тоже табличный метод, только таблица вычисляется, а не храниться.

Читайте также:  Zabbix обнаружение snmp oid

См
Jeer © (23.10.02 22:39)
UpdC32 := crctable32[BYTE(crc XOR LONGINT(octet))] XOR ((crc SHR 8) AND $00FFFFFF)


Anatoly Podgoretsky ( 2002-10-23 23:11 ) [19]

Ученик © (23.10.02 22:52)
Обрати внимание на это

ROL AL,1
RCL EDX,1
JNC @2

Здесь используется флаг переноса, а Паскале до него нет доступа. Но все зависит от целей, мне единственно не нравится, так это использование ассемблерных команд, не переносимость например на технологию .NET

У меня есть строка байтов: 0x40,0x04,0x07,0x20,0x00,0x1C,0x04,0x01,0xFE,0xB0,0x00,0x70,0x07,0x00,0x00,0x81,0x00,0x00

У меня есть описание расчета контрольной суммы:

Byte #19 is the checksum. The checksum is the sum (addition) of the previous 18 bytes modulo 256.

After a few tests it appears that the checksum is for the payload part only (not including the introduction), and is the result of the simple sum of all bytes, keeping only one byte of the result (ignoring overflows). The trick is, of course, that this checksum is made by a Big Endian system, so every byte has to be reversed before being summed, then the result reversed again.

У меня есть контрольная сумма для этого набора байтов: 0х9B

Вопрос: как рассчитать эту контрольную сумму, используя lua?

Контрольная сумма не совпадает. Как же ее все-таки посчитать?

Я являюсь студенческим промышленным инженером в области электротехники. Я не привык работать с С#. Я пытаюсь сделать контрольную сумму, состоящую из 2 байтов. Контрольная сумма вычисляется по следующему алгоритму:

A и B являются байтовыми значениями, а добавление производится modulo 256 .

Когда я запускаю программу, он разбивается на A += byteToCalculate[i]; Это предупреждение:

"Исключение типа" System.IndexOutOfRangeException "произошло в файле communicationatie.exe, но не было обработано в коде пользователя".

Может кто-нибудь помочь мне с этой проблемой?

Чтобы избежать таких неприятных ошибок ( вместо требуемого ), используйте цикл foreach:

и у вас будет более читаемый код в качестве бонуса.

Ошибка здесь: for (int я = 0; я

Вы хотите это for (int я = 0; я

Индексы массивов основаны на 0, поэтому вы хотите, чтобы итерация была на 1 меньше длины.

Ссылка на основную публикацию
Adblock detector