| Автор |
Съобщение |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 CRC16 въпрос
абе аз все си ползвам един мой алгоритъм, който обаче никога не съм проверявал дали дава същиея резултат като калкулаторите. Компилирам аз днес на х51 ядрото и се оказва че не отговаря, а тоя път от другата страна да речем не е мой софт и би трябвало да генерира по някой от стандартните. Предплагам проблема е полинома ....
Значи какво пробвах ...
unsigned int CRC16( char *source, unsigned int size)
{
unsigned int crc = 0,
i;
for(i = 0; i < size; i++)
{
crc = CRC16_table[(crc >>  & 0xFF] ^ (crc <<  ^ (*source+i);
}
return crc;
}
тук ползвам таблица.
Пробвах на приев кода от някаква тема, но също не получавам резултат като с калкулаторите, пробвах и един друг мой алгоритъм който не е табличен, ама някак все не е като в калкулатора, за това на CCS няма да говорим 
|
| Нед Авг 27, 2006 1:08 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
(*source+i) дали дава същото като *(source+i) 
|
| Нед Авг 27, 2006 1:14 pm |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
Едва ли 
|
| Нед Авг 27, 2006 2:16 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
ами ... за тов аможе да се помисли, ама е факт че първата перация е прави с първия байт от масива .....но .. все пак сега ще пробваме да видим ....
да де .. малко съм тъп, ама т е малко ... на първия наистина не оказва влияние, все пак е 0  ..........
не че като го оправих ми дава същото CRC като калкулатора де, но мерси за корекцията, даже не бях се замислил какво съм написал 
|
| Нед Авг 27, 2006 2:16 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
|
| Нед Авг 27, 2006 5:28 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
тъкмо тоя калкулатор ползвам. А алгоритъма е кейлски ако не се лъжа по горе, с лека модификациа само в предаването на данните към функциите.
п.с. и между друото на две три места съм го ползвал и си работи, само дето сега забелязвам че това дето връща не е като на нормалнот CRC16, най-вероятно таблицата е правена за друг полином.
|
| Нед Авг 27, 2006 7:00 pm |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
или за друга първоначална стойност на регистъра
виждал съм и с инверсия да се полозва полинома
//аз имах същия проблем за CRC8 , но с програмиста си уточнихме мерките и стана//
|
| Нед Авг 27, 2006 7:09 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Мдааа този сорс по горе ... ясно защо не ще ....трябва да е ето така :
crc = CRC16_table[(crc >> 8 & 0xFF) ^ *(source+i)] ^(crc <<  ;
това е добър пример защо copy/paste не е добре да се прави, и това е нещо дето съм го ползвал на няколко места .....
|
| Вто Авг 29, 2006 11:33 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Моето CRC16 използва полинома 0xA001. Погледнах линка на калкулатора, който си дал, преди доста време се дзверих и аз с него, обаче така и така не можах да докарам правилно CRC16 с този калкулатор и с полином 0xA001. Моето със сигурност смята вярно CRC16, тъй като иначе нямаха да ми работят програмите с LonWorks мрежите на Echelon  ( Всъщност, не съм въобще сигурен дали Echelon го смятат правилно )
Пак в този линк, по-долу има сорсове на Ц за изтегляне, смятащи CRC16, що не видиш те как се държат ?
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Вто Авг 29, 2006 11:53 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Ами тръгна, генерира вече както трябва, имаше грешка в сорса, естествено сега като е загледах по подробно я забелязох, това кеото се вземасхе от таблицата не бесхе резултат от текущата стойност а т предходната. Малко извратено, не знам нарочно лие било така направено, и доколко в тоя вид открива както и нормално CRC.
|
| Сря Авг 30, 2006 12:12 am |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
При някой CRC има следното
CRC32 = 0xFFFFFFFF; // CLEAR CRC
CRC32 = CalculateCRC32(buffer, len);// с таблица
CRC32 = ~CRC32;
не се споменава в документациите за сетване и накрая НОТ - откъдето идва видима "Грешка", иначе сорса за Калкулация си е напълно правилен
|
| Сря Авг 30, 2006 12:31 am |
|
|