Ver Mensaje Individual
  #2  
Antiguo 17-02-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El código en C tiene cosas que faltan.

1. crc debe estar inicializado.
2. Si asumimos la cadena como "estilo C", x debe inicializarse a 0.
3. Asumimos que count el la longitud de la cadena pero debería estar en el código y su cálculo correspondiente.
4. Tampoco sabemos si la cadena es unicode.


Con el código C preparado de esta forma, el resultado es 17940:
Código PHP:
typedef WORD ushort;

int GetCRC()
{
  
CHAR *data "13|0000123|1|Maximilian|Mustermann|05051999|21092019";
  
ushort crc 0;
  
int x 0;
  
int i;
  
int count lstrlen(data);
  while (--
count >= 0){
    
ushort z = (ushort)(data[x++] << 8);
    
crc = (ushort)(crc z);
    
8;
    do{
      if ((
crc 0x8000) != 0)
        
crc = (ushort)(crc << 0x1021);
      else
        
crc = (ushort)(crc << 1);
    } while (--
0);
  }
  return 
crc;


La traducción equivalente a delphi usando String, devuelve el mismo resultado (17940):
Código Delphi [-]
function GetCRC: integer;
var
  S: String;
  i, x: Integer;
  z: WORD;
  CRC: WORD;
  SLength, n: Integer;
begin
  S := '13|0000123|1|Maximilian|Mustermann|05051999|21092019';
  CRC:= 0;
  SLength := Length(S);
  X := 1;
  while SLength > 0 do
  begin
    Z := WORD(S[X]) shl 8;
    CRC := CRC xor Z;
    i:= 8;
    repeat
      if (CRC and $08000) <> 0 then
        CRC := (CRC shl 1) xor $1021
      else
        CRC := (CRC shl 1);
      dec(i);
    until i <= 0;
    Inc(X);
    Dec(SLength);
  end;
  Result:= CRC;
end;


Alcaraciones sobre la traducción:
1. Las cadenas delphi empiezan el indice = 1; en C comienzan en 0
2. x++ significa que tras las evaluaciones/operaciones se incrementará x
3. --i significa que i de decrementa antes que cualquier otra cosa que de haga con i (por ello uso repeat - until decrementando i consiguiendo una traducción casi literal) y por lo mismo cambio el límite de count en su bucle.


Conclusión: ambos códigos arrojan el mismo resultado y "algo" falta en la inicialización de las variables, probablemente en crc




Saludos.

Última edición por escafandra fecha: 18-02-2020 a las 00:02:13.
Responder Con Cita