PDA

Ver la Versión Completa : Ayuda para dejar mas simple este codigo


aguml
26-10-2016, 23:11:30
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:
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:
do {
if (caracter == 0x1A)
break;
caracter = *reinterpret_cast<signed char*>(sizefilelic + cadena + 1);
++sizefilelic;
} while (caracter);
La dejo asi:
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.

aguml
27-10-2016, 00:12:54
Lo que me falta por modificar creo que tiene que quedar algo tal que asi:
do {
valor1 = cadena[contador];
valor2 = valor2 ^ valor1 + contador;
++contador;
valor3 = (cadena[(valor2 % valor4) + 1] + valor2 + (valor1 + valor2) * 2 + retval) * valor2;
retval = valor3;
} while (contador < sizefilelic);
Pero creo que hago algo mal.

ecfisa
27-10-2016, 03:12:03
Hola aguml.

Al primer vistazo, lo primero que llamó mi atención es:

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

El caso es, que sizefilelic no es inicializado, por lo que tiene un valor indeterminado cuando se usa por primera vez.

Saludos :)

aguml
27-10-2016, 07:18:08
Sí se inicializa entre los dos if que hay más arriba.

aguml
27-10-2016, 07:24:37
Mi idea es dejarlo así más o menos:
AnsiString CalcularValorLIC(char *cadena,int sizebuffer)
{
unsigned long valor1, valor2 = 0, valor3;
unsigned long contador = 0;
unsigned long sizefilelic = 0;
unsigned long retval = 0;

do {
if (cadena[sizefilelic] == 0x1A)
break;
++sizefilelic;
} while(cadena[sizefilelic]);

valor3 = sizefilelic;
do {
valor1 = cadena [contador];
valor2 = valor2 ^ valor1 + contador;
retval = (cadena [(valor2 % (sizefilelic + 1)) + 1] + valor2 + (valor1 + valor2) * 2 + valor3) * valor2;
++contador;
} while (contador < sizefilelic);
return AnsiString().sprintf("%09lu", retval);
}
Ya que es seguro que en el buffer mio siempre va a haber una cadena ya que se forma a partir de una constante con lo que por lo menos la constante estará así que sobran tantos if. Ahora el caso es si el código que yo he modificado es capaz de realizar la misma tarea o me equivoqué en algo (lo más seguro). Si veis algo erróneo en la conversión del código por favor decidme.

ecfisa
27-10-2016, 12:58:08
Sí se inicializa entre los dos if que hay más arriba.
Se me escapó la tortuga, van mis disculpas :o

Saludos :)

aguml
27-10-2016, 23:28:18
Ya lo solucioné.