Ver Mensaje Individual
  #1  
Antiguo 26-10-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
Ayuda para dejar mas simple 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 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.

Última edición por aguml fecha: 26-10-2016 a las 23:18:17.
Responder Con Cita