Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Ayuda para dejar mas simple este codigo (https://www.clubdelphi.com/foros/showthread.php?t=91023)

aguml 26-10-2016 23:11:30

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

aguml 27-10-2016 00:12:54

Lo que me falta por modificar creo que tiene que quedar algo tal que asi:
Código PHP:

do {
    
valor1 cadena[contador];
    
valor2 valor2 valor1 contador;
    ++
contador;
    
valor3 = (cadena[(valor2 valor4) + 1] + valor2 + (valor1 valor2) * 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:
Código:

...
  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:
Código PHP:

AnsiString CalcularValorLIC(char *cadena,int sizebuffer)
{
    
unsigned long valor1valor2 0valor3;
    
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) * 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

Cita:

Empezado por aguml (Mensaje 510096)
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é.


La franja horaria es GMT +2. Ahora son las 08:35:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi