LINUX.ORG.RU

CRC16


0

0

Я вот немного не догоняю по поводу проверки файлов:) Помогите плиз!!! Например, у меня есть файл /bin/proga (программа) и я ее хочу проверить по алгоритму CRC16. Насколько я знаю (из документации) в алгоритм CRC16 необходимо "втолкнуть" исходную строку некоторой информации которая будет проверяться на целостность... но как??? как можно "втолкнуть" исполняемый файл? необходимо что ли его представить в виде двоичного кода и пропустить через CRC16? Помогите пожалуйста, очень необходимо узнать!

> как можно "втолкнуть" исполняемый файл? необходимо что ли его представить в виде двоичного кода и пропустить через CRC16?

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

phoenix ★★★★
()

Берешь каждый байт программы и скармливаешь его алгоритму CRC16. Насколько я помню, используется в нем образующий полином 0xA001. После прогона всей программы у тебя получится два байта контрольной суммы. Если нужны подробности какие-то, то спрашивай.

Zubok ★★★★★
()
Ответ на: комментарий от halt_use

работал только с crc8 есть два пути полином и табличный
привожу табличный
//================================
// Таблица CRC_8
const unsigned char arr_crc_8[256]=
{ 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53 };

// глобальная переменная CRC_8
unsigned char crc_8;

///////////////////////////////////
// Функция расчета CRC_8
///////////////////////////////////
void Do_CRC_8(unsigned char byte)
{
unsigned char temp;
temp=crc_8 ^ byte;
crc_8=arr_crc_8[temp];
}

функция расчета crc8
{
crc_8=0;//вычисление crc8
пока не конец файла
{
Do_CRC_8(прочитанный элемент файла);
}

return crc_8;//возвращает crc

}

rh9
()
Ответ на: комментарий от rh9

В CRC16 такой же механизм, но только таблицы другие. Их можно найти в интернете или самому нагенерировать.

Zubok ★★★★★
()

qqq

unsigned char *buf - указатель на буфер, в котором лежит файл int start - первый байт, с которого происходит расчёт суммы CRC int cnt - количество байт

crc() возращает контрольную сумму - двубайтовое число.

unsigned int crc(unsigned char *buf, int start, int cnt) { int i,j; unsigned temp,temp2,flag;

temp=0xFFFF;

for (i=start; i<cnt; i++) { temp=temp ^ buf[i];

for (j=1; j<=8; j++) { flag=temp & 0x0001; temp=temp >> 1; if (flag) temp=temp ^ 0xA001; } }

/* Reverse byte order. */

temp2=temp >> 8; temp=(temp << 8) | temp2; temp &= 0xFFFF;

return(temp); }

binr ★★
()
Ответ на: qqq от binr

Лучше все-таки через lookup tables считать, так как алгоритм гораздо быстрее. Фактически значение байта становится индексом, по нему отыскивается нужный элемент массива. Если файл будет ну уж очень большим, то разница в скорости будет заметна.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.