Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 20.06.2008, 22:38  
yegorkin
Частый гость
 
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
yegorkin на пути к лучшему
По умолчанию

// SevenZip/CRC.java

package SevenZip;

public class CRC
{
static public int[] Table = new int[256];

static
{
for (int i = 0; i ‹ 256; i++)
{
int r = i;
for (int j = 0; j ‹ 8; j++)
if ((r & 1) != 0)
r = (r ››› 1) ^ 0xEDB88320; // полином
else
r ›››= 1;
Table[i] = r;
}
}

int _value = -1;

public void Init()
{
_value = -1;
}

public void Update(byte[] data, int offset, int size)
{
for (int i = 0; i ‹ size; i++)
_value = Table[(_value ^ data[offset + i]) & 0xFF] ^ (_value ››› ;
}

public void Update(byte[] data)
{
int size = data.length;
for (int i = 0; i ‹ size; i++)
_value = Table[(_value ^ data[i]) & 0xFF] ^ (_value ››› ;
}

public void UpdateByte(int b)
{
_value = Table[(_value ^ b) & 0xFF] ^ (_value ››› ;
}

public int GetDigest()
{
return _value ^ (-1);
}
}
Реклама:
yegorkin вне форума  
Непрочитано 20.06.2008, 22:39  
yegorkin
Частый гость
 
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
yegorkin на пути к лучшему
По умолчанию

Код:
/* 7zCrc.c */

#include "7zCrc.h"

#define kCrcPoly 0xEDB88320

UInt32 g_CrcTable[256];

void InitCrcTable()
{
  UInt32 i;
  for (i = 0; i ‹ 256; i++)
  {
    UInt32 r = i;
    int j;
    for (j = 0; j ‹ 8; j++)
      if (r & 1) 
        r = (r ›› 1) ^ kCrcPoly;
      else     
        r ››= 1;
    g_CrcTable[i] = r;
  }
}

void CrcInit(UInt32 *crc) { *crc = 0xFFFFFFFF; }
UInt32 CrcGetDigest(UInt32 *crc) { return *crc ^ 0xFFFFFFFF; } 

void CrcUpdateByte(UInt32 *crc, Byte b)
{
  *crc = g_CrcTable[((Byte)(*crc)) ^ b] ^ (*crc ›› 8);
}

void CrcUpdateUInt16(UInt32 *crc, UInt16 v)
{
  CrcUpdateByte(crc, (Byte)v);
  CrcUpdateByte(crc, (Byte)(v ›› 8));
}

void CrcUpdateUInt32(UInt32 *crc, UInt32 v)
{
  int i;
  for (i = 0; i ‹ 4; i++)
    CrcUpdateByte(crc, (Byte)(v ›› (8 * i)));
}

void CrcUpdateUInt64(UInt32 *crc, UInt64 v)
{
  int i;
  for (i = 0; i ‹ 8; i++)
  {
    CrcUpdateByte(crc, (Byte)(v));
    v ››= 8;
  }
}

void CrcUpdate(UInt32 *crc, const void *data, size_t size)
{
  UInt32 v = *crc;
  const Byte *p = (const Byte *)data;
  for (; size › 0 ; size--, p++)
    v = g_CrcTable[((Byte)(v)) ^ *p] ^ (v ›› 8);
  *crc = v;
}

UInt32 CrcCalculateDigest(const void *data, size_t size)
{
  UInt32 crc;
  CrcInit(&crc);
  CrcUpdate(&crc, data, size);
  return CrcGetDigest(&crc);
}

int CrcVerifyDigest(UInt32 digest, const void *data, size_t size)
{
  return (CrcCalculateDigest(data, size) == digest);
}
yegorkin вне форума  
Непрочитано 20.06.2008, 22:40  
SergI77700
Прохожий
 
Регистрация: 09.06.2008
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
SergI77700 на пути к лучшему
По умолчанию

Сообщение от qaz12345qaz12345
Я прошу прощения, вот вроде бы после всех Ваших объяснений и ссылок мне стало понятно как это работает, не пойму только что это X^8+X^5+X^4+1. я так понимаю на месте этого должен быть байт, точнее 9 битов. Это формула? тогда что нужно подставить вместо X ?
Двойку.
Попробуй почитать тут:
http://ru.wikipedia.org/wiki/CRC
SergI77700 вне форума  
Непрочитано 23.06.2008, 08:48  
kmw
Частый гость
 
Регистрация: 30.09.2004
Сообщений: 39
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
kmw на пути к лучшему
По умолчанию

Сообщение от qaz12345qaz12345
Я прошу прощения, вот вроде бы после всех Ваших объяснений и ссылок мне стало понятно как это работает, не пойму только что это X^8+X^5+X^4+1. я так понимаю на месте этого должен быть байт, точнее 9 битов. Это формула? тогда что нужно подставить вместо X ?
http://www.intuit.ru/department/hardware/digs/14/4.html
и еще
http://www.xakep.ru/post/21788/
kmw вне форума  
Непрочитано 22.09.2008, 12:20  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

Сообщение от pambaru
Сообщение от olegras

А можно пример табличного CRC в студию?
Вот 8-ми битная CRC. Для каких-то случаев еще бывает CRC16.

typedef unsigned char byte;

flash byte DowTable[]={
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
};

byte CalcDOWCRC(byte* Data, byte Count){
byte res, i;
res=0;
for (i=0; i‹Count; i++){
res=DowTable[res ^ (*Data)];
Data++;
};
return res;
}
Мне интересно как табличка получилась,то есть брали значения с 0 по 256 и расчитывались CRC для этих чисел по определеному полиному(0x18 и будет результат crc 4 бита?),правильны мои рассуждения?
CERGEI1982 вне форума  
Непрочитано 22.09.2008, 12:22  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

Если я не ошибаюсь то в коде Yegorkin и есть расчет табличных значений
Код:
UInt32 g_CrcTable[256];

void InitCrcTable()
{
  UInt32 i;
  for (i = 0; i ‹ 256; i++)
  {
    UInt32 r = i;
    int j;
    for (j = 0; j ‹ 8; j++)
      if (r & 1)
        r = (r ›› 1) ^ kCrcPoly;
      else     
        r ››= 1;
    g_CrcTable[i] = r;
  }
}
CERGEI1982 вне форума  
Непрочитано 22.09.2008, 12:29  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию

Цитата:
Мне интересно как табличка получилась,то есть брали значения с 0 по 256 и расчитывались CRC для этих чисел по определеному полиному(0x18 и будет результат crc 4 бита?),правильны мои рассуждения?
А фиг знает, как она получилась Взята методом Ctrl+C из даташита на DS18S20

Если серьезно, то она как-то все же получается, читал, точно не помню где, наверное в аппнотах каких-то ихних.
pambaru вне форума  
Непрочитано 22.09.2008, 13:03  
kmw
Частый гость
 
Регистрация: 30.09.2004
Сообщений: 39
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
kmw на пути к лучшему
По умолчанию

Все считается и все получается! Я сам только недавно это дело изучил.
а смтореть надо
http://www.intuit.ru/department/hardware/digs/14/4.html
и еще
http://www.xakep.ru/post/21788/
kmw вне форума  
Непрочитано 23.09.2008, 12:15  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

Сообщение от kmw
Все считается и все получается! Я сам только недавно это дело изучил.
а смтореть надо
http://www.intuit.ru/department/hardware/digs/14/4.html
и еще
http://www.xakep.ru/post/21788/
В intuit еще не читал,но в хакере там вообще программки для простого смертного не понять,например *(long*)(data+bytesread)=0;
Тяжело наверно в двух словах объяснить,я ж не всю тему спрашиваю!
CERGEI1982 вне форума  
Непрочитано 23.09.2008, 12:42  
pambaru
Почётный гражданин KAZUS.RU
 
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
pambaru на пути к лучшему
По умолчанию

Сообщение от CERGEI1982
Тяжело наверно в двух словах объяснить,я ж не всю тему спрашиваю!
эх, заставил ты меня напрячься, порыться в старых исходниках
Вот, нарыл - вычисляется таблица и пишется в файл (на дельфях):

function GetBitInt(BitNo:byte;X:integer):boolean;
var mask:integer;
begin
mask:=1 shl BitNo;
Result:=X and Mask‹›0;
end;

function GetCRC(CurCrc, Data:integer):integer;
var InBit7, InBit3, InBit2:boolean;
i:integer;
begin
for i:=0 to 7 do
begin
InBit7:=GetbitInt(i,Data) xor GetbitInt(0, CurCrc);
InBit3:=InBit7 xor GetbitInt(4, CurCrc);
InBit2:=InBit7 xor GetbitInt(3, CurCrc);
CurCrc:=(CurCrc shr 1) and $FF;
SetBitInt(7, CurCrc, InBit7);
SetBitInt(3, CurCrc, InBit3);
SetBitInt(2, CurCrc, InBit2);
end;
Result:=CurCrc;
end;

procedure MakeTable;
var t:array[0..255] of byte;
i:integer;
f:text;
begin
fillChar(t, SizeOf(t),0);
for i:=0 to 255 do t[i]:=GetCRC(0,i);
assign(f,'DowTable.txt');
rewrite(f);
for i:=0 to 255 do begin
write(f,t[i]:3,', ');
if i mod 16=15 then writeln(f);
end;
close(f);
end;

Еще немного инфы (правда про генерацию таблицы где-то в другом месте было):
http://pdfserv.maxim-ic.com/en/an/AN27.pdf
pambaru вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найт алгоритм вычисления CRC для iButton... IgorSHV Цифровые сигнальные процессоры 19 18.01.2012 21:55
Компилятор Hi-Tech, вычисление, на PIC12F675 3ann Микроконтроллеры, АЦП, память и т.д 27 06.07.2009 12:01
DS1990 и crc sergio-nsk Микроконтроллеры, АЦП, память и т.д 13 12.02.2009 11:09
Вычисление параметров синусоиды по отсчетам, снятых с АЦП _DmZ_ Микроконтроллеры, АЦП, память и т.д 11 08.10.2008 16:23
Странное вычисление температуры DS18S20 nagano Микроконтроллеры, АЦП, память и т.д 0 20.08.2008 08:58


Часовой пояс GMT +4, время: 00:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot