Ver Mensaje Individual
  #1  
Antiguo 28-11-2013
DarkDudae DarkDudae is offline
Miembro
 
Registrado: abr 2006
Posts: 94
Reputación: 19
DarkDudae Va por buen camino
Ayuda conversión C++ a Delphi

Buenos días:

Tengo mi C++ un poco oxidado (vamos, como que no lo toco desde el 2000). El caso es que tengo que portar un par de funciones de C a Delphi para unos cálculos de CRC no estándares.

Los códigos en cuestión son los siguientes:

Código:
unsigned char crc8 (unsigned char *ptr, unsigned int length) 
{
unsigned char crc; unsigned int i,n; unsigned int datum; unsigned char merker;
crc = 0;
for (i=0; i < (length); i++) {
datum = *ptr++;
crc ^= datum;
for (n=0; n<8; n++) {
if (crc & 1) merker = 1; else merker = 0;
crc >>= 1;
if (merker) crc ^= 0x92; }
}
return (crc); 
}

Código:
unsigned int crc16 (unsigned char *ptr, unsigned int length) 
{
unsigned int crc, datum; unsigned int i,n;
unsigned char highbyte, lowbyte; unsigned char merker;
crc = 0;
for (i=0; i < (length/2); i++) {
highbyte = *ptr++; lowbyte = *ptr++; datum = highbyte; datum <<= 8; datum |= lowbyte; crc ^= datum;
for (n=0; n<16; n++) {
merker = (crc & 1);
crc >>= 1;
if (merker) crc ^= 0x8408;
} }
return (crc);
}
La función recibirá un array de bytes, así pues, la he portado a delphi de la siguiente forma:

Código Delphi [-]
function CRC8Portada(ptr:array of Byte; longitud: Cardinal): Byte;
var
crc:Byte;
i,n:Cardinal;
datum:Cardinal;
merker:Byte;
begin
  crc:=0;
  for i:=0 to longitud-1 do
    begin
      datum:=ptr[i+1];
      crc:=crc xor datum;
      for n:=0 to 7 do
        begin
          if (crc=1) then merker:=1
            else merker:=0;
          crc:=crc shr 1;
          if (merker=1) then crc:=crc xor $92;
        end;
    end;
    result:=crc;

end;

Código Delphi [-]
function CRC16Portada(ptr:array of Byte; longitud: Cardinal): Byte;
var
crc:Byte;
i,n:Cardinal;
datum:Cardinal;
merker, highbyte, lowbyte:Byte;
begin
  crc:=0;
  for i:=0 to ((longitud div 2)-1) do
    begin
      highbyte:=ptr[i];
      lowbyte:=ptr[i+1];
      datum:=highbyte;
      datum:=datum shl 8;
      datum:=datum OR lowbyte;
      crc:=crc xor datum;
      for n:=0 to 15 do
        begin
          if (crc=1) then merker:=1
            else merker:=0;
          crc:=crc shr 1;
          if (merker=1) then crc:=crc xor $0408;
        end;
    end;
    Result:=crc;
end;

Lo que probablemente está mal de la función es el tema de los punteros de C, pero lo cierto es que no recuerdo cómo portarlos:

Es decir:

datum = *ptr++; (¿Tal vez con Addrs o Pointer?)

Tampoco sé cómo portar sentencias como:
merker = (crc & 1);
o
datum |= lowbyte

Cualquier ayuda será bienvenida...
Responder Con Cita