Как преобразовать идентификатор карты Wiegand в двоичный файл Wiegand? - PullRequest
0 голосов
/ 23 января 2020

Интерфейс 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...