diff --git a/include/submessages.h b/include/submessages.h index 2daee9c2975ad3877df3c5ccdb2ca1ec12e11b79..be1cd5a17527fbedd0dd0a646b802b3b47f385fb 100644 --- a/include/submessages.h +++ b/include/submessages.h @@ -40,7 +40,9 @@ class SubMessage{ unsigned char* getData(); //Retorna os dados - unsigned char* objToString(); + unsigned char* objToString(); //Transforma o objeto submessage numa string - void stringToObj(unsigned char*); + void stringToObj(unsigned char*); //Transforma uma string num objeto submessage + + int checkParity(); // É diferente de 0 caso a paridade esteja errada }; diff --git a/src/submessages.cpp b/src/submessages.cpp index 05d70f658f998d53ce2fde83a7b56258bb6793c5..6489dcc4d270a73ca377bac06bed155971a7bfc7 100644 --- a/src/submessages.cpp +++ b/src/submessages.cpp @@ -128,3 +128,42 @@ void SubMessage::stringToObj(unsigned char* string){ // Passagem da paridade. parity = string[size+3]; } + +int SubMessage::checkParity(){ + int **bitsMessage; + int i, j, bitsParity[8]; + unsigned char parityTest; + + // Alocação da matriz de bits + bitsMessage = new int*[this->getSize()]; + for(i = 0 ; i < this->getSize() ; i++){ + bitsMessage[i] = new int[8]; + // Divide os dados em bits + for(j = 0 ; j < 8 ; j++){ + bitsMessage[i][j] = ((data[i] >> (7-j)) & 0x01); + } + } + + // Soma os bits verticalmente + for(j = 0 ; j < 8 ; j++){ + bitsParity[j] = 0; + for(i = 0 ; i < this->getSize() ; i++){ + bitsParity[j] = bitsParity[j] + bitsMessage[i][j]; + } + // Caso a soma vertical de uma coluna for par, bitsParity recebe 1, + // caso contrario ele recebe 0. + if((bitsParity[j] % 2) == 0){ + bitsParity[j] = 1; + }else{ + bitsParity[j] = 0; + } + // Atribui os bits para parity (variável de paridade do objeto) + parityTest = (parityTest << 1) | bitsParity[j]; + } + + if (parityTest == parity){ + return 1; + }else{ + return 0; + } +}