Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2013, 21:02   #1
Sheleh
 
Регистрация: 28.02.2008
Сообщений: 6
По умолчанию Контрольная сумма

Здравствуйте! Как на делфи посчитать контрольную сумму некоторой строки. Например есть железка, В первом столбце ее сообщения серверу, во втором ответ сервера. Судя по всем последние 4 числа - это контрольная сумма сообщения. И как ее так же подсчитать?
PHP код:
8357304031272334FF270021FD000B0100331305010170000000000000000000003DBB    210000031405
8357304031272334FF270021FD010B01003311300100809B00000000000000000095CE    210001039206
8357304031272334FF200021FD020B01003513330200109B000000000000000000CFAE    210002039806
8357304031272334FF200021FD030B01003313730100109B0000000000000000006302    210003031E05
835730403127233480240021FD080B01003313890100109A9C0000000000001900CB49    21000803A406
835730403127233480240021FD0A0B0100331373010010999C0000000000001900E17C    21000A032805
835730403127233480240021FD090B01003333730100109A9C0000000000001900E908    210009032205
835730403127233480200021FD0411003800000000000000000000000000000000C142    210004038C06
835730403127233480200021FD0511069A00000D800080000000000000000019003E53    210005030A05
835730403127233480200021FD1D0B0100333130010080999B000000000000190090C0    21001D035A05
835730403127233480200021FD1A0B0100333130010080999B0000000000001900F9AE    21001A03C806
835730403127233480290021FD180B0100333130010080999B0000000000001900DC83    210018034405
835730403127233480180021FD190B0100331130010080999C0000000000001900D890    21001903C206
835730403127233480210021FD1C0B0100331130010080999B0000000000001900AE0С    21001C03DC06
835730403127233480200021FD0B0B01003333730100109A9C0000000000001900002D    21000B03AE06
835730403127233480290021FD0D0B01003333730100109A9C0000000000001900C4E6    21000D03BA06
835730403127233480280021FD100B01003333730100109A9B00000000000019006C74    21001003F406
835730403127233480290021FD140B01003333730100109A9B00000000000019006BE5    210014036C05
835730403127233480190021FD0C0B01003313730100109A9C0000000000001900B5A1    21000C033C05
835730403127233480290021FD0E0B01003313730100109A9C00000000000019006CAE    21000E03B006
835730403127233480280021FD110B0100331373010010999B000000000000190014F3    210011037205
835730403127233480180021FD150B0100331373010010999C0000000000001900CFCA    21001503EA06
800000443D000000FF2703FFFD000F01102313050122200000000000443D0000006119    FF0300030C1E
835730403127233480190021FD0F0B0100331332010010999C0000000000001900DC54    21000F033605
835730403127233480210021FD170B0100331118010010999C0000000000001900AA7F    210017036605 
Sheleh вне форума Ответить с цитированием
Старый 29.08.2013, 21:42   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

обычный crc16
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}
const
  CRC16_STANDART_POLYNOM     = $8005;
var
  CRC16Table: array[0..255] of WORD;
procedure GenerateCRC16Table(Polynom: WORD);
var i, j: integer;
begin
  for i := 0 to 255 do
    begin
      CRC16Table[i] := i shl 8;
      for j := 0 to 7 do
        begin
          if (CRC16Table[i] and $8000) <> 0 then
            CRC16Table[i]:=(CRC16Table[i] shl 1) xor Polynom
          else
            CRC16Table[i] := CRC16Table[i] shl 1;
        end;
      CRC16Table[i] := CRC16Table[i] and $ffff;
    end;
end;

function CalculateCrc16(const Buffer: string; Initial: WORD): WORD;
var
  i: integer;
begin
  Result := Initial;
  for i := 1 to Length(Buffer) do
    Result := (Result shl 8) xor CRC16Table[(ord(Buffer[i]) xor (Result shr 8)) and $ff];
  Result := Result and $ffff;
end;

function MyCRC16(const HexData:string):string;
var
  data:string;
  crc16:word;
begin
  SetLength(data,length(HexData) div 2);
  HexToBin(PChar(HexData),PChar(data),length(data));

  GenerateCRC16Table(CRC16_STANDART_POLYNOM);
  crc16:=CalculateCrc16(data,0);
  crc16:=((crc16 shr 8) and $FF) or ((crc16 and $FF) shl 8);
  SetLength(result,sizeof(crc16)*2);

  BinToHex(PChar(@crc16),PChar(result),sizeof(crc16));
end;

procedure TForm1.Button1Click(Sender: TObject);
const input='8357304031272334FF270021FD000B010033130501017000000000000000000000';
begin
  Caption:=MyCRC16(input);
end;

end.
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 29.08.2013 в 21:46.
Slym вне форума Ответить с цитированием
Старый 30.08.2013, 17:06   #3
Sheleh
 
Регистрация: 28.02.2008
Сообщений: 6
По умолчанию

Работает! Спасибо огромное!
Sheleh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контрольная сумма Vito89 Общие вопросы Delphi 1 17.03.2011 00:21
Контрольная сумма Bad-Teo Фриланс 4 29.12.2010 01:46
контрольная сумма мандарин Помощь студентам 3 03.06.2007 19:35