Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2013
DarkDudae DarkDudae is offline
Miembro
 
Registrado: abr 2006
Posts: 94
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ayuda con conversion de tipos:u_int64_t davidj Varios 1 18-08-2008 01:47:55
Ayuda en conversión por favor ¡¡¡ axlrafael OOP 5 17-07-2008 17:33:22
ayuda!!! conversion de qreport a pdf chivix Impresión 0 02-03-2007 02:31:08
ayuda en conversión Nelly Varios 2 09-10-2006 00:40:25
Ayuda con Conversion RedVenom Varios 2 27-10-2003 01:17:29


La franja horaria es GMT +2. Ahora son las 04:05:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi