Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
AndyM Гость
|
Добавлено: Вт Окт 15 2002 07:09 Заголовок сообщения: Алгоритм для CheckSum crc16 |
|
|
Привет всем! Не знает ли кто-нить топик? Если быть точным, то нужно реализовать аналог фокспрошной функции sys(2007,сExpression)(возвращает контрольную сумму выражения cExpression) на другом языке. Заранее благодарен! |
|
Вернуться к началу |
|
|
AndyM Гость
|
Добавлено: Ср Окт 16 2002 05:56 Заголовок сообщения: Вот С-шная процедура, помогите разобраться! |
|
|
// // Function: CalcCkSum, private // // Synopsis: Calculates the checksum for a general field. // // Arguments: [ptr] -- pointer to data to calculate checksum on. // [cb] -- number of bytes in the buffer. // // Modifies: ObjectCheckSum // //---------------------------------------------------------- -------------- LOCAL void CalcCkSum(void *ptr, long cb) { long cktemp = 0; long cl = cb >> 2; long *lp = (long *) ptr; TEXT *cp;
while(cl--) cktemp ^= *lp++; cl = cb & 3; // Any remainder? cp = (TEXT *)lp; while(cl--) cktemp ^= *cp++;
ObjectCheckSum ^= cktemp; ObjectCheckSum ^= cktemp >> 8; ObjectCheckSum ^= cktemp >> 16; ObjectCheckSum ^= cktemp >> 24; } //---------------------------------------- Аргументы - указатель на данные и длина буфера. А дальше что? Ну не знаю я С ! ( |
|
Вернуться к началу |
|
|
AndyC Гость
|
Добавлено: Ср Окт 16 2002 15:05 Заголовок сообщения: Re: Вот С-шная процедура, помогите разобраться! |
|
|
long cl = cb >> 2;//количество целых 32-бит слов
while(cl--) cktemp ^= *lp++;// xor всех 32-бит слов
cl = cb & 3; // остаток 8-бит слов
while(cl--) cktemp ^= *cp++;//xor всех 8-бит слов
ObjectCheckSum ^= cktemp;//xor байта ObjectCheckSum ^= cktemp >> 8;//xor 1 байта ObjectCheckSum ^= cktemp >> 16;//xor 2 байта ObjectCheckSum ^= cktemp >> 24;//xor 3 байта
Вроде бы так ObjectCheckSum похоже 8-бит. |
|
Вернуться к началу |
|
|
AndyM Гость
|
Добавлено: Чт Окт 17 2002 11:34 Заголовок сообщения: Re: Вот С-шная процедура, помогите разобраться! |
|
|
Спасибо за помощь! А что такое TEXT *cp ? И cp = (TEXT *)lp; ?? Кароче, воткнул я эту процедуру в созданный мастером на VC++ 6.0 код. Создавалась DLL-ка, цель - передача строки и получение контрольной суммы. При компиляции получаю следующие ошибки(даю по строкам): //................. static unsigned char ObjectCheckSum = 0; int fnChecksum(void *ptr, long cb) { long cktemp = 0; long cl = cb >> 2; long *lp = (long *) ptr; TEXT *cp; // 'TEXT' : undeclared identifier //'cp' : undeclared identifier //'*' : operator has no effect; expected operator with side-effect
while(cl--) cktemp ^= *lp++; cl = cb & 3; cp = (TEXT *)lp; //syntax error : ')' while(cl--) cktemp ^= *cp++; //illegal indirection
ObjectCheckSum ^= cktemp; ObjectCheckSum ^= cktemp >> 8; ObjectCheckSum ^= cktemp >> 16; ObjectCheckSum ^= cktemp >> 24; }
Я так понял, что дело в различии между С и С++, потому что функция изначально С-шная... Может, кто поможет ее переделать... |
|
Вернуться к началу |
|
|
AndyC Гость
|
Добавлено: Чт Окт 17 2002 16:00 Заголовок сообщения: Re: Вот С-шная процедура, помогите разобраться! |
|
|
Судя по ObjectCheckSum, функция была встроена в класс и проверяла в текстовом файле (судф по TEXT*). TEXT можно заменить на unsigned char. Все остальные ошибки вытекают из-за неопределённости этого типа. На мой взгляд, static ... Obj.. не реентерабельно особенно для DLL. И грабли инициализировать перед вызовом и т.д. Проще возвращать это из функции. |
|
Вернуться к началу |
|
|
|