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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2024, 09:39   #1
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 121
По умолчанию Помогите в конвертации кода C++ -> Delphi

Есть функция расчёта контрольной суммы для ModBus_RTU
написана на C
Есть необходимость задействовать её в среде Delphi

( много лет не занимался программированием но сейчас вернулся поэтому отнеситесь с пониманием) спасибо ! )

Функция подсчета CRC16 на языке си имеет вид:

Код:

unsigned short CRC16 ( puchMsg, usDataLen )
unsigned char *puchMsg ;
unsigned short usDataLen ;
{
unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */
unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */
unsigned uIndex ; /* will index into CRC lookup table */
while (usDataLen--) /* pass through message buffer */
{
uIndex = uchCRCLo ^ *puchMsgg++ ; /* calculate the CRC */
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex} ;
uchCRCHi = auchCRCLo[uIndex] ;}
return (uchCRCHi << 8 | uchCRCLo) ;
}
static unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40} ;
static char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40};
Никто не знает больше чем не знаю я
Nester вне форума Ответить с цитированием
Старый 21.11.2024, 11:06   #2
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,468
По умолчанию

Что то типо этого, не тестировал

Код:
function CRC16(puchMsg: PByte; usDataLen: Word): Word;
var
  uchCRCHi, uchCRCLo: Byte;
  uIndex: Integer;

const
  auchCRCHi: array[0..255] of Byte = (
    \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41, \$01, $C0, \$80, \$41, \$00, $C1, \$81, \$40,
    \$01, $C0, \$80, \$41, \$00, $C1, \$81, \$40, \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41,
    \$01, $C0, \$80, \$41, \$00, $C1, \$81, \$40, \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41,
    \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41, \$01, $C0, \$80, \$41, \$00, $C1, \$81, \$40,
    \$01, $C0, \$80, \$41, \$00, $C1, \$81, \$40, \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41,
    \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41, \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41,
    \$00, $C1, \$81, \$40, \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41, \$01, $C0, \$80, \$41,
    \$00, $C1, \$81, \$40, \$00, $C1, \$81, \$40, \$01, $C0, \$80, \$41, \$00, $C1, \$81, \$40
  );

  auchCRCLo: array[0..255] of Byte = (
    \$00, $C0, $C1, \$01, $C3, \$03, \$02, $C2, $C6, \$06, \$07, $C7, \$05, $C5, $C4, \$04,
    $CC, \$0C, \$0D, $CD, \$0F, $CF, $CE, \$0E, \$0A, $CA, $CB, \$0B, $C9, \$09, \$08, $C8,
    $D8, \$18, \$19, $D9, \$1B, $DB, $DA, \$1A, \$1E, $DE, $DF, \$1F, $DD, \$1D, \$1C, $DC,
    \$14, $D4, $D5, \$15, $D7, \$17, \$16, $D6, $D2, \$12, \$13, $D3, \$11, $D1, $D0, \$10,
    $F0, \$30, \$31, $F1, \$33, $F3, $F2, \$32, \$36, $F6, $F7, \$37, $F5, \$35, \$34, $F4,
    \$3C, $FC, $FD, \$3D, $FF, \$3F, \$3E, $FE, $FA, \$3A, \$3B, $FB, \$39, $F9, $F8, \$38,
    \$28, $E8, $E9, \$29, $EB, \$2B, \$2A, $EA, $EE, \$2E, \$2F, $EF, \$2D, $ED, $EC, \$2C,
    $E4, \$24, \$25, $E5, \$27, $E7, $E6, \$26, \$22, $E2, $E3, \$23, $E1, \$21, \$20, $E0,
    $A0, \$60, \$61, $A1, \$63, $A3, $A2, \$62, \$66, $A6, $A7, \$67, $A5, \$65, \$64, $A4,
    \$6C, $AC, $AD, \$6D, $AF, \$6F, \$6E, $AE, $AA, \$6A, \$6B, $AB, \$69, $A9, $A8, \$68,
    \$78, $B8, $B9, \$79, $BB, \$7B, \$7A, $BA, $BE, \$7E, \$7F, $BF, \$7D, $BD, $BC, \$7C,
    $B4, \$74, \$75, $B5, \$77, $B7, $B6, \$76, \$72, $B2, $B3, \$73, $B1, \$71, \$70, $B0,
    \$50, \$90, \$91, \$51, \$93, \$53, \$52, \$92, \$96, \$56, \$57, \$97, \$55, \$95, \$94, \$54,
    \$9C, \$5C, \$5D, \$9D, \$5F, \$9F, \$9E, \$5E, \$5A, \$9A, \$9B, \$5B, \$99, \$59, \$58, \$98,
    \$88, \$48, \$49, \$89, \$4B, \$8B, \$8A, \$4A, \$4E, \$8E, \$8F, \$4F, \$8D, \$4D, \$4C, \$8C,
    \$44, \$84, \$85, \$45, \$87, \$47, \$46, \$86, \$82, \$42, \$43, \$83, \$41, \$81, \$80, \$40
  );

begin
  uchCRCHi := $FF;
  uchCRCLo := $FF;

  while usDataLen > 0 do
  begin
    uIndex := uchCRCLo xor puchMsg^;
    Inc(puchMsg);
    uchCRCLo := uchCRCHi xor auchCRCHi[uIndex];
    uchCRCHi := auchCRCLo[uIndex];
    Dec(usDataLen);
  end;

  Result := (uchCRCHi shl 8) or uchCRCLo;
end;
uberchel вне форума Ответить с цитированием
Старый 21.11.2024, 12:00   #3
cllc
Пользователь
 
Регистрация: 17.01.2020
Сообщений: 12
По умолчанию

never mind

Последний раз редактировалось cllc; 22.11.2024 в 05:26.
cllc вне форума Ответить с цитированием
Старый 21.11.2024, 12:01   #4
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 121
По умолчанию

Даже работает!
Спасибо!!!

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Const
   //Буффер с данными для которого нужно расчитать CRC
   Buffer: Array [0..5] Of Byte = ($01, $04, $00, $65, $00, $64);

  Var
   Form1: TForm1;


  Implementation

  {$R *.dfm}


 //Функция расчёта CRC16
 Function CRC16 (puchMsg: PByte; usDataLen: Word): Word;
  Var uchCRCHi, uchCRCLo: Byte;
      uIndex            : Integer;

  Const
   auchCRCHi: Array [0..255] Of Byte = (
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81,
    $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0,
    $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01,
    $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81,
    $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $01,
    $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81,
    $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0,
    $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01,
    $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $00, $C1, $81,
    $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40, $01, $C0,
    $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41, $01,
    $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81,
    $40);

   auchCRCLo: Array [0..255] Of Byte = (
    $00, $C0, $C1, $01, $C3, $03, $02, $C2, $C6, $06, $07, $C7, $05, $C5, $C4,
    $04, $CC, $0C, $0D, $CD, $0F, $CF, $CE, $0E, $0A, $CA, $CB, $0B, $C9, $09,
    $08, $C8, $D8, $18, $19, $D9, $1B, $DB, $DA, $1A, $1E, $DE, $DF, $1F, $DD,
    $1D, $1C, $DC, $14, $D4, $D5, $15, $D7, $17, $16, $D6, $D2, $12, $13, $D3,
    $11, $D1, $D0, $10, $F0, $30, $31, $F1, $33, $F3, $F2, $32, $36, $F6, $F7,
    $37, $F5, $35, $34, $F4, $3C, $FC, $FD, $3D, $FF, $3F, $3E, $FE, $FA, $3A,
    $3B, $FB, $39, $F9, $F8, $38, $28, $E8, $E9, $29, $EB, $2B, $2A, $EA, $EE,
    $2E, $2F, $EF, $2D, $ED, $EC, $2C, $E4, $24, $25, $E5, $27, $E7, $E6, $26,
    $22, $E2, $E3, $23, $E1, $21, $20, $E0, $A0, $60, $61, $A1, $63, $A3, $A2,
    $62, $66, $A6, $A7, $67, $A5, $65, $64, $A4, $6C, $AC, $AD, $6D, $AF, $6F,
    $6E, $AE, $AA, $6A, $6B, $AB, $69, $A9, $A8, $68, $78, $B8, $B9, $79, $BB,
    $7B, $7A, $BA, $BE, $7E, $7F, $BF, $7D, $BD, $BC, $7C, $B4, $74, $75, $B5,
    $77, $B7, $B6, $76, $72, $B2, $B3, $73, $B1, $71, $70, $B0, $50, $90, $91,
    $51, $93, $53, $52, $92, $96, $56, $57, $97, $55, $95, $94, $54, $9C, $5C,
    $5D, $9D, $5F, $9F, $9E, $5E, $5A, $9A, $9B, $5B, $99, $59, $58, $98, $88,
    $48, $49, $89, $4B, $8B, $8A, $4A, $4E, $8E, $8F, $4F, $8D, $4D, $4C, $8C,
    $44, $84, $85, $45, $87, $47, $46, $86, $82, $42, $43, $83, $41, $81, $80,
    $40);

 Begin
  uchCRCHi := $FF;
  uchCRCLo := $FF;

  While usDataLen > 0 Do
   Begin
    uIndex := uchCRCLo XOR puchMsg^;
    Inc (puchMsg);
    uchCRCLo := uchCRCHi XOR auchCRCHi [uIndex];
    uchCRCHi := auchCRCLo [uIndex];
    Dec (usDataLen);
   End;

  Result := (uchCRCHi SHL 8) OR uchCRCLo;
 End;


 //Button1
 Procedure TForm1.Button1Click(Sender: TObject);
  Begin
   Label1.Caption:= 'Контрольная сумма ( DEC ) =' +IntToStr ( CRC16 (@Buffer, Length (Buffer) ) )
 End;

End.
Никто не знает больше чем не знаю я
Nester вне форума Ответить с цитированием
Старый 26.11.2024, 11:52   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,693
По умолчанию

CRC16 Гоняем пакеты по линиям связи ?
digitalis вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с настройкой простой программы конвертации текстовых файлов (210) в xls формат бухарик Помощь студентам 29 18.05.2023 08:22
Помогите с переводом куска кода на Delphi в C++ Builder alexey6522 C++ Builder 9 17.09.2014 00:25
Ошибка конвертации Khabibula PHP 1 14.03.2011 11:11
Ошибка при конвертации tools Общие вопросы .NET 1 25.09.2009 21:56
Прошу помощи в конвертации на Делфи кода от С++. SkAndrew Общие вопросы Delphi 11 07.08.2009 12:14