Hola amigos, he conseguido esta funcion la cual hace una especie de crc muy particular de un texto y quiero dejarlo lo mas simple posible sin tantos castings ya que otras similares lo he conseguido y se que esta se puede pero no lo consigo. Aqui la funcion:
Código PHP:
AnsiString CalcularValorLIC(char *cadena,int sizebuffer)
{
signed char caracter;
unsigned long valor1, valor2, valor3, valor4;
unsigned long contador;
unsigned long sizefilelic;
unsigned long retval = 0;
if (cadena) {
caracter = *cadena;
sizefilelic = 0;
if (caracter) {
do {
if (caracter == 0x1A)
break;
caracter = *reinterpret_cast<signed char*>(sizefilelic + cadena + 1);
++sizefilelic;
} while (caracter);
}
contador = 0;
valor2 = 0;
valor3 = sizefilelic;
retval = valor3;
if (valor3) {
valor4 = valor3 + 1;
do {
valor1 = static_cast<unsigned long>(*reinterpret_cast<unsigned char*>(contador + reinterpret_cast<unsigned long>(cadena)));
valor2 = valor2 ^ valor1 + contador;
++contador;
valor3 = (*reinterpret_cast<unsigned char*>(valor2 % valor4 + reinterpret_cast<unsigned long>(cadena) + 1) + valor2 + (valor1 + valor2) * 2 + retval) * valor2;
retval = valor3;
} while (contador < sizefilelic);
}
}
return AnsiString().sprintf("%09lu", retval);
}
Lo que hace es recorrer un buffer y con una serie de operaciones obtiene la posicion de un byte con el que realizar mas operaciones he ir sumando y creando el crc.
He intentado quitarle los castings pero no doy con el modo y creo que lo hago mal y por eso da valores diferentes, porque no respeto correctamente el tema de los parentesis o algo asi.
¿podrian ayudarme a dejarlo lo mas claro posible para alguien como yo que no entiendo mucho de castings y cosas asi?
Por ejemplo esa parte si que se:
Código PHP:
do {
if (caracter == 0x1A)
break;
caracter = *reinterpret_cast<signed char*>(sizefilelic + cadena + 1);
++sizefilelic;
} while (caracter);
La dejo asi:
Código PHP:
do {
if (caracter == 0x1A)
break;
++sizefilelic;
caracter = cadena[sizefilelic];
} while (caracter);
Eso quiero hacer con todo el codigo para que sea lo mas sencillo para yo entenderlo.