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;
 }