![]() |
|
|
#1
|
|||
|
|||
![]() Надо подсчитать контрольную сумму пол полиному X^16+X^15+X^2+1.
есть код: Код:
var Form1: TForm1; implementation CONST crctab: 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); {$R *.dfm} function crc16(cp:Byte;crc:WORD):Word; begin //UpdCrc crc16:= crctab[((crc SHR 8) AND 255)] XOR (crc SHL 8) XOR cp end; procedure TForm1.btn1Click(Sender: TObject); var crc:Word; i:Integer; Buf:byte; begin if length(edt3.text)=0 then ShowMessage('Поле входных данных не заполнено'); crc:=$FFFF; for i:=1 to Length(edt3.Text) do begin crc:=crc16(byte(edt3.Text[i]),crc); end; edt2.Text:=IntToHex(crc,0); end; Где я не прав? Почему выдается не верный ответ? Заранее благодарен. |
#2
|
|||
|
|||
![]() Может кто поможет переконвертировать код С в Delphi?
while (len--) crc = (crc >> 8) ^ Crc16Table[(crc & 0xFF) ^ *pcBlock++]; return crc; |
#3
|
||||
|
||||
![]() Я помогу, если дашь не "отгрызок" кода, а полный фрагмент.
Да и зачем? Google, запрос "crc16 delphi" Третий результат - ссылка на тему в "programmersforum", где есть прямая ссылка на юнит CRC16/32 с примером использования. Но, насколько я понял, ошибка гораздо проще. Тут: Код:
crc:=$FFFF; crc:=0; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 28.06.2010 в 13:57. |
#4
|
|||
|
|||
![]() Я по этому примеру и делаю.
crc должен принимать значение $FFFF (данные с вики) -> Код:
Name : CRC-16 Poly : 0x8005 x^16 + x^15 + x^2 + 1 Init : 0xFFFF Revert: true XorOut: 0x0000 Check : 0x4B37 ("123456789") MaxLen: 4095 байт (32767 бит) - обнаружение одинарных, двойных, тройных и всех нечетных ошибок Но я пробовал и с 0, все равно считает не верно: так как при вычислении КС, ответ приписанный к входным данным, при повторном вычислении, должен возвращать в ответ 0. Т.е. Вх: F70302640008 КС: 10FD. А при Вх: F7030264000810FD КС: 00 . Вот так должна работать программа. А у меня получается с начальным значением Crc =$FFFF: Вх: F70302640008 КС:712C Вх: F70302640008712C КС: 4F55. С начальным значением CRC = 0: Вх: F70302640008 КС: F5D5. Вх: F70302640008F5D5 КС: 28C5. Еще сейчас пришлю весь код программы. |
#5
|
|||
|
|||
![]() Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) lbl1: TLabel; lbl2: TLabel; lbl3: TLabel; btn1: TButton; btn2: TButton; edt2: TEdit; edt3: TEdit; btn3: TButton; procedure btn2Click(Sender: TObject); procedure btn1Click(Sender: TObject); procedure edt3KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation CONST crctab: 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); {$R *.dfm} function crc16(data:Byte;crc:WORD):Word; begin //UpdCrc crc16:=crctab[((crc shr 8) and 255)] xor (crc SHL 8) XOR data ; end; procedure TForm1.btn2Click(Sender: TObject); begin Close; end; procedure TForm1.btn1Click(Sender: TObject); var crc:Word; i,j:Integer; st:string; begin if length(edt3.text)=0 then ShowMessage('Поле данных пусто'); crc:=$FFFF; for i:=1 to Length(edt3.Text) do begin crc:=crc16(Byte(edt3.Text[i]),crc); end; edt2.Text:=IntToHex(crc,0); end; procedure TForm1.edt3KeyPress(Sender: TObject; var Key: Char); begin if Key in [#8,'0'..'9','a'..'f','A'..'F'] then Key:=System.UpCase(Key) else begin ShowMessage('Недопустимый формат данных'); Key:=#0; end; end; |
#6
|
||||
|
||||
![]() У меня логичный вопрос: Вы в поле "Edt3" вводите значение в каком виде? HEX? Тогда вам надо считывать из Edit по ДВА символа и переводить их в байты, а не просто преобразовывать...
Код:
Procedure TForm1.btn1Click(Sender: TObject); Var crc: Word; i: Integer; b: Byte; Begin If edt3.text = '' Then // Лишняя функция Length была ShowMessage('Поле данных пусто'); Else Begin // Если поле данных было не пусто - продолжаем crc := $FFFF; // crc := 0; ? i := 1; While i<Length(edt3.Text) Do Begin b := StrToInt('$' + edt3.Text[i] + edt3.Text[i + 1]); // Преобразуем 2 символа в байт crc := crc16(b, crc); inc(i, 2); // Смещаем позицию на 2 символа End; End; edt2.Text := IntToHex(crc, 0); End; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 28.06.2010 в 17:11. |