На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Помогите с написанием функции по вычислению CRC16 и распознать алгоритм.
    Приветствую всех.

    Проблема заключается в подсчёте CRC16 из буфера.
    Контрольная сумма представлена 2 байтами и в эталоне это: 9B D7
    В буфере 11 байт из чего она вычисляется: 73 48 00 0D 00 00 00 00 00 00 00

    Прикреплённый файлПрикреплённый файл_876576764343.GIF (10,52 Кбайт, скачиваний: 1341)

    Пример во вложении Прикреплённый файлПрикреплённый файлTEST1.zip (8,4 Кбайт, скачиваний: 405) .

    Но у меня почемуто не выходит эталонная сумма :unsure:
    Сообщение отредактировано: User32 -
      Цитата
      2. The CRC is calculated using the standard polynomial 0xEDB88320. In
      case the size of the CRC is less than 4 bytes, only the low order bytes
      are used.
        Цитата Pavia @
        Цитата
        2. The CRC is calculated using the standard polynomial 0xEDB88320. In
        case the size of the CRC is less than 4 bytes, only the low order bytes
        are used.

        И что:
        2. CRC вычисляется с помощью стандартного 0xEDB88320 многочлена.
        В случае, если размер CRC меньше 4 байт, используются только младшие байты.

        Уже пробовал, та же петрушка :(

        Сейчас нашёл в ВИКИ такой вот пример:
        ExpandedWrap disabled
          /*
            Name  : CRC-16 CCITT
            Poly  : 0x1021    x^16 + x^12 + x^5 + 1
            Init  : 0xFFFF
            Revert: false
            XorOut: 0x0000
            Check : 0x29B1 ("123456789")
            MaxLen: 4095 байт (32767 бит) - обнаружение
              одинарных, двойных, тройных и всех нечетных ошибок
          */
          const unsigned short Crc16Table[256] = {
              0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
              0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
              0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
              0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
              0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
              0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
              0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
              0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
              0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
              0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
              0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
              0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
              0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
              0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
              0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
              0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
              0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
              0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
              0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
              0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
              0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
              0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
              0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
              0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
              0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
              0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
              0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
              0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
              0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
              0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
              0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
              0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
          };
           
          unsigned short Crc16(unsigned char * pcBlock, unsigned short len)
          {
              unsigned short crc = 0xFFFF;
           
              while (len--)
                  crc = (crc << 8) ^ Crc16Table[(crc >> 8) ^ *pcBlock++];
           
              return crc;
          }


        Помогите перевести на Delphi:

        ExpandedWrap disabled
          function Crc16(pcBlock: array of byte; len: Word): Word;
          const Crc16Table: array[0..255] of WORD = (
              $0000, $1021, $2042, $3063, $4084, $50A5, $60C6, $70E7,
              $8108, $9129, $A14A, $B16B, $C18C, $D1AD, $E1CE, $F1EF,
              $1231, $0210, $3273, $2252, $52B5, $4294, $72F7, $62D6,
              $9339, $8318, $B37B, $A35A, $D3BD, $C39C, $F3FF, $E3DE,
              $2462, $3443, $0420, $1401, $64E6, $74C7, $44A4, $5485,
              $A56A, $B54B, $8528, $9509, $E5EE, $F5CF, $C5AC, $D58D,
              $3653, $2672, $1611, $0630, $76D7, $66F6, $5695, $46B4,
              $B75B, $A77A, $9719, $8738, $F7DF, $E7FE, $D79D, $C7BC,
              $48C4, $58E5, $6886, $78A7, $0840, $1861, $2802, $3823,
              $C9CC, $D9ED, $E98E, $F9AF, $8948, $9969, $A90A, $B92B,
              $5AF5, $4AD4, $7AB7, $6A96, $1A71, $0A50, $3A33, $2A12,
              $DBFD, $CBDC, $FBBF, $EB9E, $9B79, $8B58, $BB3B, $AB1A,
              $6CA6, $7C87, $4CE4, $5CC5, $2C22, $3C03, $0C60, $1C41,
              $EDAE, $FD8F, $CDEC, $DDCD, $AD2A, $BD0B, $8D68, $9D49,
              $7E97, $6EB6, $5ED5, $4EF4, $3E13, $2E32, $1E51, $0E70,
              $FF9F, $EFBE, $DFDD, $CFFC, $BF1B, $AF3A, $9F59, $8F78,
              $9188, $81A9, $B1CA, $A1EB, $D10C, $C12D, $F14E, $E16F,
              $1080, $00A1, $30C2, $20E3, $5004, $4025, $7046, $6067,
              $83B9, $9398, $A3FB, $B3DA, $C33D, $D31C, $E37F, $F35E,
              $02B1, $1290, $22F3, $32D2, $4235, $5214, $6277, $7256,
              $B5EA, $A5CB, $95A8, $8589, $F56E, $E54F, $D52C, $C50D,
              $34E2, $24C3, $14A0, $0481, $7466, $6447, $5424, $4405,
              $A7DB, $B7FA, $8799, $97B8, $E75F, $F77E, $C71D, $D73C,
              $26D3, $36F2, $0691, $16B0, $6657, $7676, $4615, $5634,
              $D94C, $C96D, $F90E, $E92F, $99C8, $89E9, $B98A, $A9AB,
              $5844, $4865, $7806, $6827, $18C0, $08E1, $3882, $28A3,
              $CB7D, $DB5C, $EB3F, $FB1E, $8BF9, $9BD8, $ABBB, $BB9A,
              $4A75, $5A54, $6A37, $7A16, $0AF1, $1AD0, $2AB3, $3A92,
              $FD2E, $ED0F, $DD6C, $CD4D, $BDAA, $AD8B, $9DE8, $8DC9,
              $7C26, $6C07, $5C64, $4C45, $3CA2, $2C83, $1CE0, $0CC1,
              $EF1F, $FF3E, $CF5D, $DF7C, $AF9B, $BFBA, $8FD9, $9FF8,
              $6E17, $7E36, $4E55, $5E74, $2E93, $3EB2, $0ED1, $1EF0);
           
          var
           i: integer;
           crc: Word;
          begin
            crc := $FFFF;
            for i:=0 to len do
            begin
              crc:=  (crc shl 8) xor Crc16Table[(crc shr 8) xor pcBlock[i]];
            end;
             Result := crc;
          end;


        Вроде так, но всё равно не та сумма ...?
        Сообщение отредактировано: User32 -
          User32, посмотри пример рассчета CRC16 с использованием Delphi, приведенный здесь ... проверил его работает правильно ;)
            CRC бывают разные.
            Первое что надо сказать про полином иногда их записывают в обратном порядке бит.

            Вот взял проверил

            CRC16 c классическим полиномом=22E7
            CRC32 с классический полиномом=1A2FD79B
            Выборочные полиномы CRC
            CRC16 полином $8005=22E7
            CRC32 полином $04C11DB7 =1A2FD79B
            CRC16CCITT ошибочный CCITT=7952
            CRC16CCITTG правильный CCITT=8551
            CRC30 полином $6030B9C7 =3877E0B2
            реверсирование полинома полином $EDB88320 =4C11DB7
            реверсирование полинома полином $8005 =A001
            реверсирование полинома полином $1021 =8408

            Как видно из теста правильный результат дал классический 32 битный полином из которого взяли младшие два байта.

            А вот мой код для проверки различных CRC.

            ExpandedWrap disabled
              unit Unit1;
               
              interface
               
              uses
                Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                Dialogs, StdCtrls, Math;
               
              type
                TForm1 = class(TForm)
                  Button1: TButton;
                  Memo1: TMemo;
                  Button2: TButton;
                  procedure Button1Click(Sender: TObject);
                  procedure Button2Click(Sender: TObject);
                private
                  { Private declarations }
                public
                  { Public declarations }
                end;
              type
               TCRC=
                record
                bit:byte;
                Poly:DWord;
                Init,XorOut:Dword;
                ReflIn,ReflOut:boolean;
                end;
              var
                Form1: TForm1;
                test:array [0..8] of char=('1','2','3','4','5','6','7','8','9');
                test2:array [0..3]of byte=($11,$22,$33,$44);
                testCRC16:Word=$BB3D;
                testCRC16CCITT:Word=$29B1;
                testCRC16CCITTG:Word=$E5CC; {init=1D0F}
                testCRC32:DWord=$CBF43926;
                tabelCRC:array [0..$FF] of DWord;
                tabelCRC16:array [0..$FF] of Word =
                ($0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241
                ,$C601,$06C0,$0780,$C741,$0500,$C5C1,$C481,$0440
                ,$CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1,$CE81,$0E40
                ,$0A00,$CAC1,$CB81,$0B40,$C901,$09C0,$0880,$C841
                ,$D801,$18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40
                ,$1E00,$DEC1,$DF81,$1F40,$DD01,$1DC0,$1C80,$DC41
                ,$1400,$D4C1,$D581,$1540,$D701,$17C0,$1680,$D641
                ,$D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040
                ,$F001,$30C0,$3180,$F141,$3300,$F3C1,$F281,$3240
                ,$3600,$F6C1,$F781,$3740,$F501,$35C0,$3480,$F441
                ,$3C00,$FCC1,$FD81,$3D40,$FF01,$3FC0,$3E80,$FE41
                ,$FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840
                ,$2800,$E8C1,$E981,$2940,$EB01,$2BC0,$2A80,$EA41
                ,$EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1,$EC81,$2C40
                ,$E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640
                ,$2200,$E2C1,$E381,$2340,$E101,$21C0,$2080,$E041
                ,$A001,$60C0,$6180,$A141,$6300,$A3C1,$A281,$6240
                ,$6600,$A6C1,$A781,$6740,$A501,$65C0,$6480,$A441
                ,$6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41
                ,$AA01,$6AC0,$6B80,$AB41,$6900,$A9C1,$A881,$6840
                ,$7800,$B8C1,$B981,$7940,$BB01,$7BC0,$7A80,$BA41
                ,$BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40
                ,$B401,$74C0,$7580,$B541,$7700,$B7C1,$B681,$7640
                ,$7200,$B2C1,$B381,$7340,$B101,$71C0,$7080,$B041
                ,$5000,$90C1,$9181,$5140,$9301,$53C0,$5280,$9241
                ,$9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440
                ,$9C01,$5CC0,$5D80,$9D41,$5F00,$9FC1,$9E81,$5E40
                ,$5A00,$9AC1,$9B81,$5B40,$9901,$59C0,$5880,$9841
                ,$8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81,$4A40
                ,$4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,$4C80,$8C41
                ,$4400,$84C1,$8581,$4540,$8701,$47C0,$4680,$8641
                ,$8201,$42C0,$4380,$8341,$4100,$81C1,$8081,$4040);
                tabelCRC32:array [0..$FF] of DWord =
                ($00000000,$77073096,$EE0E612C,$990951BA
                ,$076DC419,$706AF48F,$E963A535,$9E6495A3
                ,$0EDB8832,$79DCB8A4,$E0D5E91E,$97D2D988
                ,$09B64C2B,$7EB17CBD,$E7B82D07,$90BF1D91
                ,$1DB71064,$6AB020F2,$F3B97148,$84BE41DE
                ,$1ADAD47D,$6DDDE4EB,$F4D4B551,$83D385C7
                ,$136C9856,$646BA8C0,$FD62F97A,$8A65C9EC
                ,$14015C4F,$63066CD9,$FA0F3D63,$8D080DF5
                ,$3B6E20C8,$4C69105E,$D56041E4,$A2677172
                ,$3C03E4D1,$4B04D447,$D20D85FD,$A50AB56B
                ,$35B5A8FA,$42B2986C,$DBBBC9D6,$ACBCF940
                ,$32D86CE3,$45DF5C75,$DCD60DCF,$ABD13D59
                ,$26D930AC,$51DE003A,$C8D75180,$BFD06116
                ,$21B4F4B5,$56B3C423,$CFBA9599,$B8BDA50F
                ,$2802B89E,$5F058808,$C60CD9B2,$B10BE924
                ,$2F6F7C87,$58684C11,$C1611DAB,$B6662D3D
                ,$76DC4190,$01DB7106,$98D220BC,$EFD5102A
                ,$71B18589,$06B6B51F,$9FBFE4A5,$E8B8D433
                ,$7807C9A2,$0F00F934,$9609A88E,$E10E9818
                ,$7F6A0DBB,$086D3D2D,$91646C97,$E6635C01
                ,$6B6B51F4,$1C6C6162,$856530D8,$F262004E
                ,$6C0695ED,$1B01A57B,$8208F4C1,$F50FC457
                ,$65B0D9C6,$12B7E950,$8BBEB8EA,$FCB9887C
                ,$62DD1DDF,$15DA2D49,$8CD37CF3,$FBD44C65
                ,$4DB26158,$3AB551CE,$A3BC0074,$D4BB30E2
                ,$4ADFA541,$3DD895D7,$A4D1C46D,$D3D6F4FB
                ,$4369E96A,$346ED9FC,$AD678846,$DA60B8D0
                ,$44042D73,$33031DE5,$AA0A4C5F,$DD0D7CC9
                ,$5005713C,$270241AA,$BE0B1010,$C90C2086
                ,$5768B525,$206F85B3,$B966D409,$CE61E49F
                ,$5EDEF90E,$29D9C998,$B0D09822,$C7D7A8B4
                ,$59B33D17,$2EB40D81,$B7BD5C3B,$C0BA6CAD
                ,$EDB88320,$9ABFB3B6,$03B6E20C,$74B1D29A
                ,$EAD54739,$9DD277AF,$04DB2615,$73DC1683
                ,$E3630B12,$94643B84,$0D6D6A3E,$7A6A5AA8
                ,$E40ECF0B,$9309FF9D,$0A00AE27,$7D079EB1
                ,$F00F9344,$8708A3D2,$1E01F268,$6906C2FE
                ,$F762575D,$806567CB,$196C3671,$6E6B06E7
                ,$FED41B76,$89D32BE0,$10DA7A5A,$67DD4ACC
                ,$F9B9DF6F,$8EBEEFF9,$17B7BE43,$60B08ED5
                ,$D6D6A3E8,$A1D1937E,$38D8C2C4,$4FDFF252
                ,$D1BB67F1,$A6BC5767,$3FB506DD,$48B2364B
                ,$D80D2BDA,$AF0A1B4C,$36034AF6,$41047A60
                ,$DF60EFC3,$A867DF55,$316E8EEF,$4669BE79
                ,$CB61B38C,$BC66831A,$256FD2A0,$5268E236
                ,$CC0C7795,$BB0B4703,$220216B9,$5505262F
                ,$C5BA3BBE,$B2BD0B28,$2BB45A92,$5CB36A04
                ,$C2D7FFA7,$B5D0CF31,$2CD99E8B,$5BDEAE1D
                ,$9B64C2B0,$EC63F226,$756AA39C,$026D930A
                ,$9C0906A9,$EB0E363F,$72076785,$05005713
                ,$95BF4A82,$E2B87A14,$7BB12BAE,$0CB61B38
                ,$92D28E9B,$E5D5BE0D,$7CDCEFB7,$0BDBDF21
                ,$86D3D2D4,$F1D4E242,$68DDB3F8,$1FDA836E
                ,$81BE16CD,$F6B9265B,$6FB077E1,$18B74777
                ,$88085AE6,$FF0F6A70,$66063BCA,$11010B5C
                ,$8F659EFF,$F862AE69,$616BFFD3,$166CCF45
                ,$A00AE278,$D70DD2EE,$4E048354,$3903B3C2
                ,$A7672661,$D06016F7,$4969474D,$3E6E77DB
                ,$AED16A4A,$D9D65ADC,$40DF0B66,$37D83BF0
                ,$A9BCAE53,$DEBB9EC5,$47B2CF7F,$30B5FFE9
                ,$BDBDF21C,$CABAC28A,$53B39330,$24B4A3A6
                ,$BAD03605,$CDD70693,$54DE5729,$23D967BF
                ,$B3667A2E,$C4614AB8,$5D681B02,$2A6F2B94
                ,$B40BBE37,$C30C8EA1,$5A05DF1B,$2D02EF8D);
              implementation
               
              {$R *.dfm}
              function GetCRC32(p:pointer;length:integer):DWord;
              var b1,b2:byte;
              crc:DWord;
              var i:integer;
              begin
              CRC:=$FFFFFFFF;
              for i:=0 to length-1 do
               begin
               CRC:= (CRC shr 8) xor TabelCRC32[byte(CRC) xor Byte(PChar(p)[i])];
               end;
              CRC:=CRC xor $FFFFFFFF;
              GetCRC32:=CRC;
              end;
               
              function GetCRC16(p:pointer;length:integer):Word;
              var b1,b2:byte;
              crc:Word;
              var i:integer;
              begin
              CRC:=0;
              for i:=0 to length-1 do
               begin
               CRC:= (CRC shr 8) xor TabelCRC16[byte(CRC) xor Byte(PChar(p)[i])];
               end;
              CRC:=CRC xor $0;
              GetCRC16:=CRC;
              end;
               
              function revers(w:DWord; j:integer):DWord;
              var i:integer;
              p:DWord;
              begin
              p:=0;
              for i:=1 to j do
               begin
               if w and 1<>0 then   p:=(p shl 1) or 1 else p:=(p shl 1);
               w:=w shr 1;
               end;
              revers:=p;
              end;
               
              function CRC(bit:byte;Poly:DWord; Init,XorOut:Dword;ReflIn,ReflOut:boolean):TCRC;
              begin
              Result.Init:=Init;
              Result.XorOut:=XorOut;
              Result.Poly:=Poly;
              Result.bit:=bit;
              Result.ReflIn:=ReflIn;
              Result.ReflOut:=ReflOut;
              end;
               
              procedure CreatTableCRC(T:TCRC;Tabel:Pointer);
              type
               TTable=array [0..0] of DWord;
               PTable=^TTable;
              var
                i, j: Word;
                crc: DWord;
              begin
              if (t.ReflIn) then
               begin
               t.Poly:=revers(t.Poly,t.bit);
                for i := 0 to 255 do
                 begin
                 crc := i;
                 for j := 0 to 7 do
                    if (crc and 1) <> 0 then
                      crc := (crc shr 1) xor t.Poly
                    else
                      crc := (crc shr 1);
                  PTable(Tabel)[i] := crc;
                 end;
               end else
               begin
                for i := 0 to 255 do
                 begin
                 crc := i shl (t.bit-8);
                 for j := 0 to 7 do
                    if (crc and (1 shl (t.bit-1))) <> 0 then
                      crc := (crc shl 1) xor t.Poly
                    else
                      crc := (crc shl 1);
                  PTable(Tabel)[i] := crc  mod (1 shl t.bit);
                 end;
               end;
              end;
               
              function GetCRC(t:TCRC;p:pointer;length:integer;Tabel:Pointer):DWord;
              type
               TTable=array [0..0] of DWord;
               PTable=^TTable;
              var
              crc:DWord;
              i:integer;
              begin
               CRC:=t.Init;
              if (t.ReflIn) then
               for i:=0 to length-1 do
                CRC:= (CRC shr 8) xor PTable(Tabel)[byte(CRC) xor Byte(PChar(p)[i])]
               else
               begin
               for i:=0 to length-1 do
                CRC:= (CRC shl 8) xor PTable(Tabel)[byte(CRC shr (t.bit-8)) xor Byte(PChar(p)[i])];
               end;
              CRC:=CRC xor t.XorOut;
              if (t.ReflOut xor  t.ReflIn) then   CRC:=revers(CRC,t.bit);
              GetCRC:=CRC shl (32-t.bit) shr (32-t.bit);
              end;
               
              procedure TForm1.Button1Click(Sender: TObject);
              var c1,c2,c3,c4,c5:DWord;
              t:TCRC;
              begin
              memo1.Text:='';
              c1:=GetCRC16(@Test,Length(Test));
              c2:=GetCRC32(@Test,Length(Test));
              t:=CRC(16,$8005,$0,$0,true,true);
              CreatTableCRC(t,@TabelCRC);
              c3:=GetCRC(t,@Test,Length(Test),@TabelCRC);
              t:=CRC(32,$04C11DB7,$FFFFFFFF,$FFFFFFFF,true,true);
              CreatTableCRC(t,@TabelCRC);
              c4:=GetCRC(t,@Test,Length(Test),@TabelCRC);
              if c1=TestCRC16 then memo1.Lines.Add('CRC16=OK');
              if c2=TestCRC32 then memo1.Lines.Add('CRC32=OK');
              memo1.Lines.Add('Custom CRC');
              if c3=TestCRC16 then memo1.Lines.Add('CRC16=OK');
              if c4=TestCRC32 then memo1.Lines.Add('CRC32=OK');
               
              t:=CRC(16,$1021,$FFFF,$0,false,false);
              CreatTableCRC(t,@TabelCRC);
              c3:=GetCRC(t,@Test,Length(Test),@TabelCRC);
              if c3=testCRC16CCITT then memo1.Lines.Add('CRC16CCITT=OK');
               
              t:=CRC(16,$1021,$1D0F,$0,false,false);
              CreatTableCRC(t,@TabelCRC);
              c4:=GetCRC(t,@Test,Length(Test),@TabelCRC);
              if c4=testCRC16CCITTG then  memo1.Lines.Add('CRC16CCITTG=OK');
               
              t:=CRC(30,$6030B9C7,$3FFFFFFF,$0,True,True);
              CreatTableCRC(t,@TabelCRC);
              c5:=GetCRC(t,@Test,Length(Test),@TabelCRC);
              memo1.Lines.Add(format('%X',[c5]));
               
              t:=CRC(32,$4C11DB7,$FFFFFFFF,$FFFFFFFF,true,true);
              CreatTableCRC(t,@TabelCRC);
              c5:=GetCRC(t,@Test2,4,@TabelCRC);
              memo1.Lines.Add(format('%X',[c5]));
               
               
              end;
               
              procedure TForm1.Button2Click(Sender: TObject);
              var
              c1,c2,c3,c4,c5:DWord;
              t:TCRC;
              test:String;
              begin
              test:=#$73#$48#$00#$0D#$00#$00#$00#$00#$00#$00#$00;
              memo1.Text:='';
              c1:=GetCRC16(@Test[1],Length(Test));
              c2:=GetCRC32(@Test[1],Length(Test));
              t:=CRC(16,$8005,$0,$0,true,true);
              CreatTableCRC(t,@TabelCRC);
              c3:=GetCRC(t,@Test[1],Length(Test),@TabelCRC);
              t:=CRC(32,$04C11DB7,$FFFFFFFF,$FFFFFFFF,true,true);
              CreatTableCRC(t,@TabelCRC);
              c4:=GetCRC(t,@Test[1],Length(Test),@TabelCRC);
               
              memo1.Lines.Add(Format('CRC16 c классическим полиномом=%.2X',[c1]));
              memo1.Lines.Add(Format('CRC32 с классический полиномом=%X',[c2]));
              memo1.Lines.Add('Custom CRC');
              memo1.Lines.Add(Format('CRC16 полином $8005=%.2X',[c1]));
              memo1.Lines.Add(Format('CRC32 полином $04C11DB7  =%X',[c2]));
               
              t:=CRC(16,$1021,$FFFF,$0,false,false);
              CreatTableCRC(t,@TabelCRC);
              c3:=GetCRC(t,@Test[1],Length(Test),@TabelCRC);
              memo1.Lines.Add(Format('CRC16CCITT ошибочный CCITT=%.2X',[c3]));
               
              t:=CRC(16,$1021,$1D0F,$0,false,false);
              CreatTableCRC(t,@TabelCRC);
              c4:=GetCRC(t,@Test[1],Length(Test),@TabelCRC);
              memo1.Lines.Add(Format('CRC16CCITTG правильный CCITT=%.2X',[c4]));
               
              t:=CRC(30,$6030B9C7,$3FFFFFFF,$0,True,True);
              CreatTableCRC(t,@TabelCRC);
              c5:=GetCRC(t,@Test[1],Length(Test),@TabelCRC);
              memo1.Lines.Add(Format('CRC30 полином $6030B9C7 =%X',[c5]));
              memo1.Lines.Add(Format('реверсирование полинома полином $EDB88320 =%X',[revers($EDB88320,32)]));
              memo1.Lines.Add(Format('реверсирование полинома полином $8005 =%.2X',[revers($8005,16)]));
              memo1.Lines.Add(Format('реверсирование полинома полином $1021 =%.2X',[revers($1021,16)]));
               
              end;
               
              end.


            Ошибочным CRC CCITT считается алгоритм через таблицу. Правильный это полином по классической схеме, путем побитового деления.
            В коде показано как ошибочный табличный алгоритм переделать в правильный табличный. Делается это заменой начального значения расчёта.
              Цитата Pavia @
              CRC32 с классический полиномом

              Да действительно так, я у себя в алгоритме вычисления CRC32 нашёл ошибку - исправил.
              Спасибо.
                Извиняюсь за поднятие старой темы.

                Цитата User32 @
                А вот мой код для проверки различных CRC.

                Проверял на CRC32, при ReflIn := False в функции CreatTableCRC таблица всегда заполняется только нулями.
                Может есть подправленный исходник?
                Сообщение отредактировано: sierra -
                  Изменил
                  ExpandedWrap disabled
                    PTable(Tabel)[i] := crc mod (1 shl T.bit);

                  на
                  ExpandedWrap disabled
                    PTable(Tabel)[i] := crc;
                  вроде стало правильно считать.

                  PS: Pavia, спасибо за код
                  Сообщение отредактировано: sierra -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0441 ]   [ 18 queries used ]   [ Generated: 29.03.24, 12:57 GMT ]