CRC 16 объясните алгоритм

Здравствуйте! Есть код на С
unsigned short usCRC = 0xFFFF;unsigned char bByte = 0x5a;unsigned short usIndex;usCRC ^= bByte << 8;for (usIndex = 0; usIndex <= 7; usIndex++) {  usCRC = usCRC & 0x8000 ? (usCRC << 1) ^ 0x1021 : usCRC << 1; }
Я плохо знаю С, мне нужно написать тоже на Delphi, пожалуйста помогите! Объясните как работает этот алгоритм!
14 ответов

usCRC ^= bByte << 8;
osCRC := usCRC xor (bByte shl 8)
usCRC = usCRC & 0x8000 ? (usCRC << 1) ^ 0x1021 : usCRC << 1; 
  
if ( (usCRC and 8000h) = 8000h) then        usCRC := (usCRC shl 1) xor 1021helse        usCRC := usCRC shl 1;


shr  в ассемблере это сдвиг направо (shift right), а в коде на Си налево. Или в дельфи все наоборот ;) ?


бес попутал


SizeOF(short) = 2?


SizeOF(short) = 2?
Да. 2 байта.Есть такой замечательный стандартный файлик limits.h
/*  * limits.h * This file has no copyright assigned and is placed in the Public Domain. * This file is a part of the mingw-runtime package. * No warranty is given; refer to the file DISCLAIMER within the package. * * Functions for manipulating paths and directories (included from io.h) * plus functions for setting the current drive. * * Defines constants for the sizes of integral types. * * NOTE: GCC should supply a version of this header and it should be safe to *       use that version instead of this one (maybe safer). * */#ifndef _LIMITS_H_#define _LIMITS_H_/* All the headers include this file. */#include <_mingw.h>/* * File system limits * * TODO: NAME_MAX and OPEN_MAX are file system limits or not? Are they the *       same as FILENAME_MAX and FOPEN_MAX from stdio.h? * NOTE: Apparently the actual size of PATH_MAX is 260, but a space is *       required for the NUL. TODO: Test? */#define PATH_MAX    259/* * Characteristics of the char data type. * * TODO: Is MB_LEN_MAX correct? */#define CHAR_BIT    8#define MB_LEN_MAX    2#define SCHAR_MIN    (-128)#define SCHAR_MAX    127#define UCHAR_MAX    255/* TODO: Is this safe? I think it might just be testing the preprocessor, *       not the compiler itself... */#if    ('\x80' < 0)#define CHAR_MIN    SCHAR_MIN#define CHAR_MAX    SCHAR_MAX#else#define CHAR_MIN    0#define CHAR_MAX    UCHAR_MAX#endif/* * Maximum and minimum values for ints. */#define INT_MAX        2147483647#define INT_MIN        (-INT_MAX-1)#define UINT_MAX    0xffffffff/* * Maximum and minimum values for shorts. */#define SHRT_MAX    32767#define SHRT_MIN    (-SHRT_MAX-1)#define USHRT_MAX    0xffff/* * Maximum and minimum values for longs and unsigned longs. * * TODO: This is not correct for Alphas, which have 64 bit longs. */#define LONG_MAX    2147483647L#define LONG_MIN    (-LONG_MAX-1)#define ULONG_MAX    0xffffffffUL#ifndef __STRICT_ANSI__/* POSIX wants this.  */ #define SSIZE_MAX LONG_MAX#endif#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \     || !defined(__STRICT_ANSI__)/* ISO C9x macro names */#define LLONG_MAX 9223372036854775807LL#define LLONG_MIN (-LLONG_MAX - 1)#define ULLONG_MAX (2ULL * LLONG_MAX + 1)#endif/* * The GNU C compiler also allows 'long long int' */#if !defined(__STRICT_ANSI__) && defined(__GNUC__)#define LONG_LONG_MAX    9223372036854775807LL#define LONG_LONG_MIN    (-LONG_LONG_MAX-1)#define ULONG_LONG_MAX    (2ULL * LONG_LONG_MAX + 1)/* MSVC compatibility */#define _I64_MIN LONG_LONG_MIN#define _I64_MAX LONG_LONG_MAX#define ********* ULONG_LONG_MAX#endif /* Not Strict ANSI and GNU C compiler */#endif /* not _LIMITS_H_ */ 


Есть такой замечательный стандартный файлик limits.h
Честно у меня нету  яж пишу на DelphiЧто то я не разберусь (( видимо С код это оч сложная вещь...Есть массив:7E, 30, 00, 00, 2B, 37, 00, 7F,     A0, B2Последние 2 байта это CRC. Вот как его нашли от всего массива?


unsigned short Crc16(unsigned char *pcBlock, unsigned short len){    unsigned short crc = 0xFFFF;    unsigned char i;     while (len--)    {        crc ^= *pcBlock++ << 8; Только нужно переделать...        for (i = 0; i < 8; i++)            crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;    }     return crc;}
Вот вроде нашел очень похожее на то что мне нужно  Только вот незадача (( опять на С


Вот как его нашли от всего массива? 
RinOSpro, в том участке кода, что был приведен в первом посте, нет нахождения crc массиватам упушен цикл


Вот вроде нашел очень похожее на то что мне нужно
ага тут все хватает, только вот дельфи не помню..посмотри тут   


function GetCRC(ALengthBuf: Word): Word;var  i, j : Byte;begin  Result := $FFFF;  for i := 1 to ALengthBuf do  begin    Result := Result xor (FBuf[i] shl 8);    for j := 0 to 7 do      if ((Result and $8000) = $8000) then        Result := (Result shl 1) xor $1021      else        Result := Result shl 1;  end;end;
Написал вроде работает ))))))) Счастью нет предела ))))))Спасибо всем!!!


  Result := Result xor (FBuf[i] shl 8);
а буфер (FBuf) представлен глобальной переменной ?некрасиво, лучше передавать его по ссылке как параметр..Добавлено через 1 минуту и 59 секунд
  Dec(ALengthBuf);
а эта строчка зачем ? там переменная i и так инкрементируется в цикле


Dec(ALengthBuf);
Бес попутал  от предыдущих экспериментов осталось 
а буфер (FBuf) представлен глобальной переменной ?некрасиво, лучше передавать его по ссылке как параметр..
FBuf глобальная переменная в классе.


FBuf глобальная переменная в классе. 
ну тогда этой функцией можно вычислять контрольную сумму только одного и того же буффера.. лично я не вижу смысла так ограничивать ее использование..  


ну тогда этой функцией можно вычислять контрольную сумму только одного и того же буффера.. 
mes - а больше ее нигде использовать и не придется. А вообще если кому то она нужна будет то ее, сам видишь, переделать 5 сек.