///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CALC_CRC5
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Calcula CRC de polinomios de 6 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recibe:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//value: byte del valor del cual calcular el CRC
//poly: byte del valor del polinomio ASOCIADO* con el cual se calcula el CRC
//enter_value: byte del valor de entrada con el cual realizar XOR
//exit_value: byte del valor de salida con el cual realizar XOR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Devuelve:
//value: byte con el CRC calculado
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int8 CRC5(int8 value, int8 poly, int8 init_value, int8 exit_value){

     int8 res,i;

     res=value;
    
     res^=init_value;

     for(i=0;i<5;i++){
         if(res & 1){
             res>>= 1;
             res^=poly;
         }else{
             res>>= 1;
         }
     }

    res^=exit_value;
    return (int)res;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CALC_CRC7
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Calcula CRC de polinomios de 8 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recibe:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//value: byte del valor del cual calcular el CRC
//poly: byte del valor del polinomio ASOCIADO* con el cual se calcula el CRC
//enter_value: byte del valor de entrada con el cual realizar XOR
//exit_value: byte del valor de salida con el cual realizar XOR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Devuelve:
//value: byte con el CRC calculado
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int8 CRC7(int8 value, int8 poly, int8 init_value, int8 exit_value){

     int8 res,i;

     res=value;
    
     res^=init_value;

     for(i=0;i<7;i++){
         if(res & 1){
             res>>= 1;
             res^=poly;
         }else{
             res>>= 1;
         }
     }

    res^=exit_value;
    return (int)res;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CALC_CRC8
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Calcula CRC de polinomios de 9 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recibe:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//value: byte del valor del cual calcular el CRC
//poly: byte del valor del polinomio ASOCIADO* con el cual se calcula el CRC
//enter_value: byte del valor de entrada con el cual realizar XOR
//exit_value: byte del valor de salida con el cual realizar XOR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Devuelve:
//value: byte con el CRC calculado
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int8 CRC8(int8 value, int8 poly, int8 init_value, int8 exit_value){

     int8 res,i;

     res=value;
    
     res^=init_value;

     for(i=0;i<8;i++){
         if(res & 1){
             res>>= 1;
             res^=poly;
         }else{
             res>>= 1;
         }
     }

    res^=exit_value;
    return (int)res;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CALC_CRC16
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Calcula CRC de polinomios de 17 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recibe:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//value: int16 del valor del cual calcular el CRC
//poly: int16 del valor del polinomio ASOCIADO* con el cual se calcula el CRC
//enter_value: int16 del valor de entrada con el cual realizar XOR
//exit_value: int16 del valor de salida con el cual realizar XOR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Devuelve:
//value: int16 con el CRC calculado
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int16 CRC16(int8 value, int16 poly, int16 init_value, int16 exit_value){

     int16 res;
     int8 i;

     res=value;
    
     res^=init_value;

     for(i=0;i<8;i++){
         if(res & 1){
             res>>= 1;
             if(i==2) cout << res << "\n";
             res^=poly;
         }else{
             res>>= 1;              
         }
         cout << res << "\n";
     }

    res^=exit_value;
    return res;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CALC_CRC32
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Calcula CRC de polinomios de 33 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recibe:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//value: int32 del valor del cual calcular el CRC
//poly: int32 del valor del polinomio ASOCIADO* con el cual se calcula el CRC
//enter_value: int32 del valor de entrada con el cual realizar XOR
//exit_value: int32 del valor de salida con el cual realizar XOR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Devuelve:
//value: int32 con el CRC calculado
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int32 CRC32(int8 value, int32 poly, int32 init_value, int32 exit_value){

     int32 res;
     int8 i;

     res=value;
    
     res^=init_value;

     for(i=0;i<8;i++){
         if(res & 1){
             res>>= 1;
             if(i==2) cout << res << "\n";
             res^=poly;
         }else{
             res>>= 1;              
         }
         cout << res << "\n";
     }

    res^=exit_value;
    return res;
}
