реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> CRC32 для 8бит, помогите найти медленные исходники
west329_
сообщение Apr 4 2008, 12:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Столкнулся с проблемой реализации CRC32 функции для контроллера на С. В сети множество исходников но они все используют так сказать быстрый расчет, обычно генерирую динамическую таблицу в озу 255 Long значений ? 1kb озу сразу седает, есть ещё вариант со статической таблицей промежуточных полиномов, но от этого тоже легче седается 1kb памяти прграммы sad.gif. Но есть ещё медленная релизация алгоритма для 32бит полиномиальная, встречалась мне для crc16 и crc8? н о для crc32 так нигде и не нашол.

Подскажите если ктото сталкивался ?
С ув.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 4 2008, 12:48
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



www.pavel.hut1.ru
1-я ссылка по гуглю (алгоритм CRC32)

извиняюсь, по яндексу

Сообщение отредактировал MrYuran - Apr 4 2008, 12:51


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 4 2008, 12:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Если памяти жалко, то можно работать с двумя таблицами для полубайтов. Займут 128 байт.

"Медленная" реализация для CRC32 ничем не отличается от CRC16, кроме разрядности.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 4 2008, 12:52
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(aaarrr @ Apr 4 2008, 15:48) *
"Медленная" реализация для CRC32 ничем не отличается от CRC16, кроме разрядности.

... и полинома


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 4 2008, 12:56
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(west329_ @ Apr 4 2008, 15:37) *
Подскажите если ктото сталкивался ?
Насколько я понимаю в CRC, любой "медленный" расчет строится по одному из двух алгоритмов:
Код
uintX_t CRC1(uintX_t crc, uint8_t byte)
{
    crc ^= byte;
    uint_fast8_t i = 8;
    do
    {
        if (crc & (1 << 0)) { crc >>= 1; crc ^= CRC_POLYNOME; }
        else crc >>= 1;
    }
    while(--i);
  
    return crc;
}

uintX_t CRC2(uintX_t crc, uint8_t byte)
{
    crc ^= (uintX_t)byte << N;
    uint_fast8_t i = 8;
    do
    {
        if (crc & (1 << K)) { crc <<= 1; crc ^= CRC_POLYNOME; }
        else crc <<= 1;
    }
    while(--i);
  
    return crc;
}
// N = 0 для CRC8, 8 для CRC16, 24 для CRC32
// K = 7 для CRC8, 15 для CRC16, 31 для CRC32
Где uintX_t - соответственно uint8_t, uint16_t или uint32_t. Как нетрудно увидеть, они отличаются только направлением сдвига и вытекающим из него анализом либо крайнего правого либо крайнего левого бита и начальным XOR либо с крайним правым либо с крайним левым байтом. Зная полином, остается только выбрать нужный алгоритм.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
west329_
сообщение Apr 4 2008, 12:56
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Вот один из примеров медленного бщета crc правд для 16






/*------------------------------------------------------------------------------
CRC16SIZE.C

Расчёт CRC-16 с оптимизацией по длине
------------------------------------------------------------------------------*/

typedef unsigned char uchar;
typedef signed char schar;

typedef unsigned int uint;
typedef signed int sint;


uint wCRC;



void InitCRC16(void)
{
wCRC = 0xFFFF;
}



void CalcCRC16(uchar bT)
{
uchar i;

wCRC ^= bT;
for (i=0; i<8; i++)
{
wCRC >>= 1;
if (CY == 1) wCRC ^= 0xA001;
}
}



void MakeCRC16(uchar *pbData, uint wSize)
{
InitCRC();
while (wSize-- > 0) CalcCRC( *(pbData++) );
}






возможно ли его переписать для crc32? полином для 32 бит 0х04C11DB7






Насчет поисков я искал и гуглом и яндексом и нашол не мало реализаций, часть из которых даже работала но не так как хотелосьбы.
P/S/ пишу на форум когда уже выхода нету

to Сергей Борщ. Благодарю , попробую прописать.

Сообщение отредактировал west329_ - Apr 4 2008, 13:02
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 4 2008, 13:12
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Код

ulong wCRC;

void InitCRC32(void)
{
wCRC = 0xFFFFFFFF;
}



void CalcCRC32(uchar bT)
{
uchar i;

wCRC ^= bT;
for (i=0; i<8; i++)
{
wCRC >>= 1;
if (CY == 1) wCRC ^= POLY;
}
}


где POLY - ваш 0х04C11DB7

я вот так думаю...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
aleksey_g
сообщение Apr 4 2008, 13:15
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066



Встретил вот такое:
Код
unsigned long CalcCRC32(unsigned long CRC, unsigned char Symbol)
{
   unsigned long temp;
   CRC ^= 0xFFFFFFFF ^ Symbol;
   for(int k = 8; k--;)
      {
      temp = -(CRC & 1), CRC >>= 1, CRC ^= 0xEDB88320ul & temp;
      }
   CRC ^= 0xFFFFFFFF;
   return CRC;
}

и на паскале

function calccr32(crc:longword;symbol:integer):longword;
var k:integer;
    temp:longword;
begin
crc:= crc xor ($FFFFFFFF xor symbol);
for k:=0 to 7 do
begin
temp:= -(CRC and 1);
crc:=crc shr 1;
crc:=crc xor 3988292384 and temp;
end;
crc:=crc xor $FFFFFFFF;
calccr32:=crc;
end;
Go to the top of the page
 
+Quote Post
sysel
сообщение Apr 4 2008, 13:41
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852



Посмотрите в википедии
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 4 2008, 20:55
Сообщение #10



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Код
#define CRC_LENGTH 32
#define POLY 0xblah-blah-blah

// коэффициенты CRC32_yy = crc32(yy, 0), где yy = {2^0, 2^1, ..., 2^(CRC_LENGTH-1)}
// считаются предварительно для требуемого полинома и CRC32_init = 0 через сдвиги
// (или берутся готовые :))
const uint32 CRC32_Table[CRC_LENGTH] = {CRC32_0, ..., CRC32_31};

uint32 crc32(uint32 x, uint32 CRC32_init)
{
   uint i;
   uint32 bitmask, y, CRC32 = 0;

   y = x ^ CRC32_init;
   for(i = 0, mask =1; i < CRC_LENGTH; i++, bitmask <<= 1)
      if(y & bitmask) CRC32 ^= CRC32_Table[i];
   return CRC32;
}

// или для экономии памяти
uint32 crc32(uint32 x, uint32 CRC32)
{
   uint i;
   uint32 bitmask;

   x ^= CRC32; CRC32 = 0;
   for(i = 0, mask =1; i < CRC_LENGTH; i++, bitmask <<= 1)
      if(x & bitmask) CRC32 ^= CRC32_Table[i];
   return CRC32;
}

// или для еще большей экономии памяти на 8-битниках
// выровнять таблицу по 0bx0000000, uint8 bitmask, i лишний и т.д.:)

Для CRC8 (цикл стОит развернуть), CRC16, CRCxx, ... аналогично.
Если время совсем не напрягает, то через сдвиги, как уже предлагали.
Go to the top of the page
 
+Quote Post
west329_
сообщение Apr 5 2008, 08:25
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Всем учасника выражаю благодарность за ответы. будем компилировать, возникнут вопросы выложу
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01439 секунд с 7
ELECTRONIX ©2004-2016