Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/10/2016, 15:20
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Dar mas sencillez a este codigo

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 C++:
Ver original
  1. AnsiString CalcularValorLIC(char *cadena,int sizebuffer)
  2. {
  3.     signed char caracter;
  4.     unsigned long valor1, valor2, valor3, valor4;
  5.     unsigned long contador;
  6.     unsigned long sizefilelic;
  7.     unsigned long retval = 0;
  8.  
  9.     if (cadena) {
  10.         caracter = *cadena;
  11.         sizefilelic = 0;
  12.         if (caracter) {
  13.             do {
  14.                 if (caracter == 0x1A)
  15.                     break;
  16.                 caracter = *reinterpret_cast<signed char*>(sizefilelic + cadena + 1);
  17.                 ++sizefilelic;
  18.             } while (caracter);
  19.         }
  20.         contador = 0;
  21.         valor2 = 0;
  22.         valor3 = sizefilelic;
  23.         retval = valor3;
  24.         if (valor3) {
  25.             valor4 = valor3 + 1;
  26.             do {
  27.                 valor1 = static_cast<unsigned long>(*reinterpret_cast<unsigned char*>(contador + reinterpret_cast<unsigned long>(cadena)));
  28.                 valor2 = valor2 ^ valor1 + contador;
  29.                 ++contador;
  30.                 valor3 = (*reinterpret_cast<unsigned char*>(valor2 % valor4 + reinterpret_cast<unsigned long>(cadena) + 1) + valor2 + (valor1 + valor2) * 2 + retval) * valor2;
  31.                 retval = valor3;
  32.             } while (contador < sizefilelic);
  33.         }
  34.     }
  35.  
  36.     return AnsiString().sprintf("%09lu", retval);
  37. }
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 e 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 C++:
Ver original
  1. do {
  2.                 if (caracter == 0x1A)
  3.                     break;
  4.                 caracter = *reinterpret_cast<signed char*>(sizefilelic + cadena + 1);
  5.                 ++sizefilelic;
  6.             } while (caracter);
La dejo asi:
Código C++:
Ver original
  1. do {
  2.                 if (caracter == 0x1A)
  3.                     break;
  4.                 ++sizefilelic;
  5.                 caracter = cadena[sizefilelic];
  6.             } while (caracter);
Eso quiero hacer con todo el codigo para que sea lo mas sencillo para yo entenderlo.
Lo que me falta por modificar creo que tiene que quedar algo tal que asi:
Código C++:
Ver original
  1. *********** do {
  2. * * * * * * * * valor1 =cadena [contador];
  3. * * * * * * * * valor2 = valor2 ^ valor1 + contador;
  4. * * * * * * * * ++contador;
  5. * * * * * * * * valor3 = (cadena [(valor2 % valor4) + 1] + valor2 + (valor1 + valor2) * 2 + retval) * valor2;
  6. * * * * * * * * retval = valor3;
  7. * * * * * * } while (contador < sizefilelic);
Pero creo que hago algo mal.

Última edición por aguml; 26/10/2016 a las 16:06