Czytniki RFID wysyłają dane w różnych formatach. Popularny jest 10-cyfrowy kod unsigned long, popularne aplikacje w Pythonie odczytują RFID w postaci stringu, który zawiera po przecinku cztery liczby. Napiszemy konwersję jednego formatu na drugi.
Aby to się udało liczbę 10 cyfrową najpierw przedstawiamy w systemie szesnastkowym (4 bajty) następnie tniemy na bajty i każdy jest zamieniany osobno na liczbę dziesiętną w odwróconej kolejności (najpierw najmłodszy bajt).
Oto program w dwie strony
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <iostream> #include <sstream> #include <vector> using namespace std; string RFIDdecToString(unsigned long int rfid) {//zamienia liczbę 10-cyfrową na ciąg 123,123,123,123 (0-255 x4) string wynik = ""; stringstream ss; ss << hex << rfid; string hexNumber(ss.str()); while (hexNumber.length() < 8) hexNumber = "0" + hexNumber; for (int i = 6; i >= 0; i -= 2) wynik += to_string(stoi(hexNumber.substr(i, 2), 0, 16)) + (i != 0 ? "," : ""); //{ // string cyfra = hexNumber.substr(i, 2); // int liczba10 = stoi(cyfra, 0, 16); //} return wynik; } unsigned long RFIDstringToDec(string str) { //zamienia string "123,123,123,123" (0-255) na liczbę 10-cyfrową long (4 bajty) std::vector<int> vect; std::stringstream ss(str); for (int i; ss >> i;) { vect.push_back(i); if (ss.peek() == ',') ss.ignore(); } string suma = ""; for (std::size_t i = 0; i < vect.size(); i++) { stringstream ss1; ss1 << hex << vect[i]; string hexNumber(ss1.str()); if (hexNumber.length() == 1) //jeśli wychodzi liczba 1-cyfrowa szesnastkowa zamiast 2-cyfrowej... hexNumber = string("0") + hexNumber; //doklejenie 0 na początku jeśli trzeba suma = hexNumber + suma; //doklejamy ale w odwrotnej kolejności pierwszy bajt na koniec, ostatni na początek } return stoul(suma, 0, 16); //stoul - STRING to UNSIGNED LONG (stoi ma za mały zakres) } int main(int argc, char** argv) { int a; string wynik1 = RFIDdecToString(65534); long wynik2 = RFIDstringToDec(wynik1); cout << wynik2; cin >> a; return 0; } |
Analogicznie w JavaString jedna z funkcji tak wygląda:
1 2 3 4 5 6 7 8 9 10 11 12 | function RFIDdecToString(rfid) //dla podanego w stringu rfid w systemie 10 zwraca string postaci 9,13,42,32 { var liczba = parseInt(rfid).toString(16); //zamienia go na liczbę dec a potem na 16 tkową var wynik=""; for (var i=6; i>=0; i-=2) { var cyfra = liczba.substring(i,i+2); wynik += parseInt(cyfra, 16) + (i!=0 ? "," : ""); } return wynik; } |