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...