Интерфейс Wiegand:
- идентификатор карты состоит из кода объекта и номера карты;
- код объекта представляет первые 3 цифры:
000
- Номер карты представляет последние 5 цифр:
99999
- теперь мы должны взять эти числа и преобразовать их в двоичный код и здесь лежит проблема
- код объекта должен быть 8-разрядным двоичным файлом
- номер карты должен быть 16-разрядным двоичным кодом
- 99999 не может быть представленными в 16 битах.
- что мне теперь делать?
Я создал класс, который принимает любое десятичное число и преобразует его в идентификатор карты с соответствующим кодом объекта. и номер карты:
class Wiegand {
private:
std::vector<bool> wiegandArray = std::vector<bool>(26, false);
uint8_t facilityCode;
uint16_t cardNumber;
void calculate(uint32_t dec) {
// transform dec number into binary number using single bit shift operation
// and store it in wiegandArray[]
for (int i = 24; i > 0; --i) {
wiegandArray[i] = dec & 1;
dec >>= 1;
}
// check for parity of the first 12 bits
bool even = 0;
for(int i = 1; i < 13; i++) {
even ^= wiegandArray[i];
}
// add 0 or 1 as first bit (leading parity bit - even) based on the number of 'ones' in the first 12 bits
wiegandArray[0] = even;
// check for parity of the last 12 bits
bool odd = 1;
for(int i = 13; i < 25; i++) {
odd ^= wiegandArray[i];
}
// add 0 or 1 as last bit (trailing parity bit - odd) based on the number of 'ones' in the last 12 bits
wiegandArray[25] = odd;
}
public:
Wiegand(uint32_t id) {
calculate(id);
facilityCode = id >> 16;
cardNumber = id & 0xffff;
}
//returns a 26 length std::vector<bool>
std::vector<bool> getWiegandBinary() {
return wiegandArray;
}
//returns uint8_t facilityCode
uint8_t getFacilityCode() {
return facilityCode;
}
//returns uint16_t cardNumber
uint16_t getCardNumber() {
return cardNumber;
}
//returns an 8 characters long String
String getCardID() {
String s1 = String(facilityCode);
String s2 = String(cardNumber);
String s3 = String(facilityCode);
while(s1.length() < 3) {
s1 = String(0) + s1;
}
while(s2.length() < 5) {
s2 = String(0) + s2;
}
String s3 = s1 + s2;
return s3;
}
};
Проблема заключается в том, что Wiegand Central возвращает идентификатор карты при сканировании карты, а не представление Wiegand в десятичном формате. Поэтому я должен сохранить этот формат. Мне нужен некоторый фокус-покус, который принимает 00099999
как идентификатор карты, а не как десятичное представление, как мой Wiegand class
.
Десятичный 99999
равен 000000011000011010011111
в 24-битном представлении. Это означает:
- Код объекта:
00000001
или 1
; - Номер карты:
1000011010011111
или 34463
; - Это означает, что карта ID:
00134463
.
Я безумно пытаюсь создать алгоритм, который берет идентификатор карты 00099999
и преобразует его так, чтобы он мог дать мне код объекта: 000
и номер карты 99999
, а затем превратить это в правильный 26-битный Виганд.
Сейчас я думаю, что это невозможно сделать. Что вы думаете?
РЕДАКТИРОВАТЬ:
Я думаю, что номер карты 00099999
даже не может существовать. Я не разговаривал ни с одним поставщиком карт и думаю, что должен был это сделать, потому что мне не хватает важной информации, касающейся формата идентификатора карты. Я думаю, что идентификатор карты можно сделать только в виде объединения кода объекта в диапазоне от 0 до 255 и номера карты в диапазоне от 0 до 65535. Таким образом, «самый большой» Может существовать идентификатор карты 25565535
. Если это правда, входные данные должны состоять из кода объекта (0-255) и номера карты (0 - 65535), который затем будет формировать номер карты и который я легко могу преобразовать в бит Wiegand 26.
Класс String