I>unsigned short crc (char *buf,unsigned char len)
I>{
I> unsigned char i, j;
I> union {
I> unsigned char _crc[2];
I> unsigned short crc;
I> } s;
I> unsigned char a, C, a1, C1;
I> s.crc = 0;
I> for (i=0; i<len; i++) {
I> a = (unsigned char)buf[i];
I> a1 = (unsigned char)~buf[i];
I> for (j=0; j<8; j++) {
I> C = (unsigned char)(((s._crc[0] ^ a) & 0x01) << 7);
I> C1 = (unsigned char)(((s._crc[1] ^ a1) & 0x01) << 7);
I> if (C) s._crc[0] ^= 0x18;
I> if (C1) s._crc[1] ^= 0x18;
I> s._crc[0] = (unsigned char)((s._crc[0] >> 1) | C);
I> s._crc[1] = (unsigned char)((s._crc[1] >> 1) | C1);
I> a >>= 1;
I> a1 >>= 1;
I> }
I> }
I> return s.crc;
I>}
I>
I>И если можно обьясните зачем создается массив, хотя из функции возвращается только число?
Ключевое слово — union.
В данном случае запись идет в массив _crc, а чтение — из short crc.
Предполагается, что они оба расположены по тому же адресу и short весит 2 байта.
Если этот код рассматривать как код С++ — он содержит в себе неопределенное поведение, так как нельзя записывать в один член объединения, а читать из другого.
Правильным было бы вообще не использовать объединение и его член crc, а использовать только массив _crc2, а потом указатель на его начало приводить к указателю на short:
Здравствуйте, jazzer, Вы писали:
J>Если этот код рассматривать как код С++ — он содержит в себе неопределенное поведение, так как нельзя записывать в один член объединения, а читать из другого.
А где в стандарте об этом можно прочитать? Я что-то не нашёл
Здравствуйте, jazzer, Вы писали:
J>Ключевое слово — union. J>В данном случае запись идет в массив _crc, а чтение — из short crc. J>Предполагается, что они оба расположены по тому же адресу и short весит 2 байта. J>Если этот код рассматривать как код С++ — он содержит в себе неопределенное поведение, так как нельзя записывать в один член объединения, а читать из другого.
А Вы не могли бы описать что оно делает? Чтобы я мог его реализовать в паскале?
Здравствуйте, ironwit, Вы писали:
I>А Вы не могли бы описать что оно делает? Чтобы я мог его реализовать в паскале?
Дык, судя даже по названию, эта функция подсчитывает CRC для блока данных из buf; CRC (контрольная суммя) используется обычно для контроля целостности данных. Причем этот алгоритм не похож на стандартный CRC16 и, ИМХО, далеко не самый эффективный.
Возможно стоит поискать другой сразу на паскале или делфях. Другое дело, если тебе прийдется работать со старыми файлами данных, в которых CRC посчитан именно этой функцией...
Здравствуйте, Auster, Вы писали:
A>Здравствуйте, ironwit, Вы писали:
I>>А Вы не могли бы описать что оно делает? Чтобы я мог его реализовать в паскале? A>Возможно стоит поискать другой сразу на паскале или делфях. Другое дело, если тебе прийдется работать со старыми файлами данных, в которых CRC посчитан именно этой функцией...
Да в том то и дело, что необходимо использовать старый протокол в новых целях. Но оборудование никто изменять не будет, вот и приходится использовать то, что есть....
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, ironwit, Вы писали:
I>>И если можно обьясните зачем создается массив, хотя из функции возвращается только число?
К>Просто грязный код, вот и всё. У кого-то голова перегрелась в момент написания.