// encode loaded data to machester + header void RfidHidTagData::encode() { byte dataCopy[DATA_BUF_LEN]; int lengthCopy; memcpy(dataCopy, data, length); // store original data to temp buffer lengthCopy = length; // store length clear(); insertBit(0); // header 3 x 0 + 3 x 1 insertBit(0); insertBit(0); insertBit(1); insertBit(1); insertBit(1); for(int i = 0; i < lengthCopy; i++) { if( dataCopy[i] == 1 ) { insertBit( 1 ); insertBit( 0 ); } else { insertBit( 0 ); insertBit( 1 ); } } }
// load data void RfidHidTagData::loadHex(byte data[]) { int i,j; clear(); for(j = 4; j >= 0; j--) insertBit( (data[0] & (0x01 << j) ? 1 : 0) ); for(i = 1; i <= 5; i++) { for(j = 7; j >= 0; j--) insertBit( (data[i] & (0x01 << j) ? 1 : 0) ); } }
// Stvara stablo valica s bitovima void insertBit(node ** tree, int duljinaNiz, int duljinaAbecede, char *abeceda, char *niz) { int imaNula = 0; int i = 0; int j = 0; int znakPrveAbecede = 0; int brojac = 0; int brojacNula = 0; char pomocni[2]; char *bitovi = duljinaNiz % 8 ? (char *) malloc(duljinaNiz / 8 + 1) : (char *) malloc(duljinaNiz / 8); char *sljedeciPodniz1 = NULL, *sljedeciPodniz2 = NULL; char *prvaAbeceda = (char *) malloc(duljinaAbecede / 2); char *drugaAbeceda = (char *) malloc(duljinaAbecede - duljinaAbecede / 2); // Inicijaliziraj memset(prvaAbeceda, '\0', sizeof(char) * ((duljinaAbecede / 2) - 1)); memset(drugaAbeceda, '\0', sizeof(char) * ((duljinaAbecede - duljinaAbecede / 2) - 1)); // Napravi prvu abecedu for (i = 0; i < duljinaAbecede / 2; i++) { prvaAbeceda[i] = abeceda[i]; brojac++; } // Napravi drugu abecedu for (i = 0; i < duljinaAbecede - duljinaAbecede / 2; i++) { drugaAbeceda[i] = abeceda[i + duljinaAbecede / 2]; } for (i = 0; i < duljinaNiz; i++) { for (j = 0; j < brojac; j++) { if (*(niz + i) == prvaAbeceda[j]) { imaNula++; } } } // Napravi dva podniza i oba inicijaliziraj sljedeciPodniz1 = (char *) malloc(imaNula + 1); memset(sljedeciPodniz1, '\0', sizeof(char) * (imaNula)); sljedeciPodniz2 = (char *) malloc(duljinaNiz - imaNula + 1); memset(sljedeciPodniz2, '\0', sizeof(char) * (duljinaNiz - imaNula)); // Napravi bitove za cvor for (i = 0; i < duljinaNiz; i++) { for (j = 0; j < brojac; j++) { if (*(niz + i) == prvaAbeceda[j]) { znakPrveAbecede = 1; } } pomocni[0] = *(niz + i); // Znak pripada prvoj abecedi if (znakPrveAbecede == 1) { *(bitovi + i / 8) = setBit(i, 0); strncat(sljedeciPodniz1, pomocni, 1); brojacNula++; } // Znak pripada drugoj abecedi else { *(bitovi + i / 8) = setBit(i, 1); strncat(sljedeciPodniz2, pomocni, 1); } znakPrveAbecede = 0; } // Napravi novi cvor if (*tree == NULL) { *tree = NoviCvor(bitovi); } // Pozovi rekurziju if (duljinaAbecede > 2) { if (duljinaAbecede - duljinaAbecede / 2 > 1) { insertBit(&((*tree)->right), duljinaNiz - brojacNula, duljinaAbecede - duljinaAbecede / 2, drugaAbeceda, sljedeciPodniz2); } if (duljinaAbecede / 2 > 1) { insertBit(&((*tree)->left), brojacNula, duljinaAbecede / 2, prvaAbeceda, sljedeciPodniz1); } } // Oslobodi memoriju free(prvaAbeceda); free(drugaAbeceda); free(sljedeciPodniz1); free(sljedeciPodniz2); }