Ver Mensaje Individual
  #4  
Antiguo 02-01-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Blade_Is_One,

Cita:
Empezado por Blade_Is_One
El problema que tengo es que necesito usar este algoritmo que me entregaron en C# y lo debo implementar en un sistema hecho en Delphi
Cita:
Empezado por mamcx
Cuando te enfrentes a estas cosas, lo que debes hacer es concentrarte en que problema tienes, no en el codigo concreto. Que es lo que hace? Como se llama el algoritmo usado? y entonces buscas una implementacion en Delphi que logre lo mismo.
No soy experto en C# pero según entiendo el algoritmo realiza : El Cálculo del CRC16 de un String en base al Polinomio Generador $A001.

Revisa este código:
Código Delphi [-]
Library CRC;

uses
   SysUtils, Classes, Dialogs, StrUtils, Math;

{$R *.res}

function Crc16(Buffer : String; Polynom, Initial : Cardinal) : Cardinal;
var
   i,j : Integer;

begin
   Result := Initial;
   for i := 1 to Length(Buffer) do
   begin
      Result := Result xor ord(buffer[i]);
      for j := 0 to 7 do
      begin
         if (Result and $0001) <> 0 then
            Result := (Result shr 1) xor Polynom
         else
            Result := Result shr 1;
      end;
   end;
end;

function ComputeChecksum(Buffer : PChar) : Cardinal; stdcall;
var
   i : Cardinal;
   CrcTable : Array[0..255] of Cardinal;

begin

   for i := 0 to 255 do
      CrcTable[i] := Crc16(chr(i), $A001, 0);

   Result := 0;

   for i := 1 to Length(Buffer) do
     Result := (Result shr 8) xor CrcTable[(ord(Buffer[i]) xor Result) and $ff];

end;

exports
   ComputeChecksum;

end.
El código anterior Calcula el CRC16 de un String en base al Polinomio Generador $A001 por medio de la función exportada ComputeChecksum de la DLL CRC.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

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

  function ComputeChecksum(Buffer : PChar) : Cardinal; StdCall; external 'CRC.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(IntToStr(ComputeChecksum(PChar(Edit1.Text))));
end;

end.
El código anterior utiliza la DLL CRC para el cálculo del CRC16 de un String.

Revisa estos Links:
Cita:
CRC calculations
http://www.miscel.dk/MiscEl/CRCcalculations.html

Tutorial: Cyclic Redundancy Check (CRC) Computation
https://marcel.wanda.ch/Tutorial/CRC/
Quizás esta solución se pueda adaptar a tu proyecto.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 02-01-2013 a las 20:19:36.
Responder Con Cita