Ver Mensaje Individual
  #1  
Antiguo 17-02-2020
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Convertir código C++ a Delphi (para lograr un cierto "CRC" de una cadena de entrada)

Hola a todos,

Me han encargado cierta tarea para la que no parezco estar capacitado... creo que el código C++ que me han pasado debería ser más completo, en todo caso, pero, como no controlo C++... tampoco sé hasta qué punto algunas partes del código pueden deducirse, por decirlo así...

El código en cuestión es el siguiente:

Código:
while (--count >= 0)
{
  ushort z = (ushort)(data[x++] << 8);

  crc = (ushort)(crc ^ z);

  i = 8;

  do
  {
    if ((crc & 0x8000) != 0)
      crc = (ushort)(crc << 1 ^ 0x1021);
    else
      crc = (ushort)(crc << 1);

  } while (--i > 0);
}
Se supone que "data" es una cadena tal que la siguiente, mejor dicho, una cadena exactamente como la siguiente:

Cita:
13|0000123|1|Maximilian|Mustermann|05051999|21092019
Dicho "data" debería producir un "CRC" exactamente igual a: 5320

Hay cosas que se me escapan, como la variable "x", que, entiendo que es la posición / caracter, de la variable "data". De este modo, he conseguido armar el siguiente código... que ya me sorprende que compile... y se ejecute sin errores aparentes...

Código Delphi [-]
var
  S: string;
  I, X: Integer;
  Z: UInt;
  CRC: Word;
  SLength, N: Integer;
begin
  S := '13|0000123|1|Maximilian|Mustermann|05051999|21092019';

  SLength := Length(S);

  X := 0;
  CRC := 0;

  while SLength >= 0 do
  begin
    Z := Word(S[X]) shl 8;

    CRC := CRC xor Z;

    for I := 8 downto 0 do
    begin

     if (CRC and $08000) <> 0 then
       CRC := (CRC shl 1) xor $1021
     else
       CRC := (CRC shl 1);

    end;

    Inc(X);
    Dec(SLength);
  end;

  // Resultado: 30841, o sea, no el esperado: 5320
  ShowMessage(IntToStr(CRC));
end;

Sin embargo, el resultado que obtengo en "CRC", es 30841, o sea, no 5320. Por otro lado, si no inicializo la variable CRC, es decir, el siguiente código:

Código Delphi [-]
var
  S: string;
  I, X: Integer;
  Z: UInt;
  CRC: Word;
  SLength, N: Integer;
begin
  S := '13|0000123|1|Maximilian|Mustermann|05051999|21092019';

  SLength := Length(S);

  X := 0;

  while SLength >= 0 do
  begin
    Z := Word(S[X]) shl 8;

    CRC := CRC xor Z;

    for I := 8 downto 0 do
    begin

     if (CRC and $08000) <> 0 then
       CRC := (CRC shl 1) xor $1021
     else
       CRC := (CRC shl 1);

    end;

    Inc(X);
    Dec(SLength);
  end;

  // Resultado: 62152, o sea, no el esperado: 5320
  ShowMessage(IntToStr(CRC));
end;

... sigo sin obtener el resultado esperado... en fin... reconozco que estoy perdido: porque no sé si estoy traduciendo el código C++ en condiciones (diría que no), porque, o sé siquiera cómo es que se puede ejecutar el código Delphi mostrado sin errores... y, finalmente, porque no sé si es que el código que me han dado para traducir... en realidad no puede traducirse, puesto que falten datos...

¿Alguna posible ayuda?

¡Muchísimas gracias de antemano!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita