Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.06.2008, 22:38
|
|
Частый гость
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
// 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 ››› ![Горд собой](images/smilies/icon_dovl.gif) ;
}
public void Update(byte[] data)
{
int size = data.length;
for (int i = 0; i ‹ size; i++)
_value = Table[(_value ^ data[i]) & 0xFF] ^ (_value ››› ![Горд собой](images/smilies/icon_dovl.gif) ;
}
public void UpdateByte(int b)
{
_value = Table[(_value ^ b) & 0xFF] ^ (_value ››› ![Горд собой](images/smilies/icon_dovl.gif) ;
}
public int GetDigest()
{
return _value ^ (-1);
}
}
|
|
|
|
20.06.2008, 22:39
|
|
Частый гость
Регистрация: 12.02.2007
Сообщений: 40
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Код:
|
/* 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);
} |
|
|
|
|
20.06.2008, 22:40
|
|
Прохожий
Регистрация: 09.06.2008
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от qaz12345qaz12345
|
Я прошу прощения, вот вроде бы после всех Ваших объяснений и ссылок мне стало понятно как это работает, не пойму только что это X^8+X^5+X^4+1. я так понимаю на месте этого должен быть байт, точнее 9 битов. Это формула? тогда что нужно подставить вместо X ?
|
Двойку.
Попробуй почитать тут:
http://ru.wikipedia.org/wiki/CRC
|
|
|
|
23.06.2008, 08:48
|
|
Частый гость
Регистрация: 30.09.2004
Сообщений: 39
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
Сообщение от 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/
|
|
|
|
22.09.2008, 12:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от 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 бита?),правильны мои рассуждения?
|
|
|
|
22.09.2008, 12:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Если я не ошибаюсь то в коде 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;
}
} |
|
|
|
|
22.09.2008, 12:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Цитата:
|
Мне интересно как табличка получилась,то есть брали значения с 0 по 256 и расчитывались CRC для этих чисел по определеному полиному(0x18 и будет результат crc 4 бита?),правильны мои рассуждения?
|
А фиг знает, как она получилась ![Улыбка](images/smilies/icon_smile.gif) Взята методом Ctrl+C из даташита на DS18S20
Если серьезно, то она как-то все же получается, читал, точно не помню где, наверное в аппнотах каких-то ихних.
|
|
|
|
23.09.2008, 12:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
В intuit еще не читал,но в хакере там вообще программки для простого смертного не понять,например *(long*)(data+bytesread)=0;
Тяжело наверно в двух словах объяснить,я ж не всю тему спрашиваю!
|
|
|
|
23.09.2008, 12:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Сообщение от CERGEI1982
|
Тяжело наверно в двух словах объяснить,я ж не всю тему спрашиваю!
|
эх, заставил ты меня напрячься, порыться в старых исходниках ![Улыбка](images/smilies/icon_smile.gif)
Вот, нарыл - вычисляется таблица и пишется в файл (на дельфях):
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
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|