Координатный идентификатор одной и той же карты, которую читают два разных устройства чтения карт

В части программного обеспечения карта считывается устройством чтения карт и выделяется пользователю. А в другой части этого программного обеспечения, в терминале с тем же устройством чтения карт, пользовательская карта считывает и извлекает данные из базы данных по серийному номеру карты и т. Д.

В новой части этого программного обеспечения появился новый терминал с новым кард-ридером. карта считывается с этого устройства чтения карт и извлекает данные из базы данных и т. д.

Итак, теперь проблема в том, что одна и та же карта, которую читают эти два устройства чтения карт, различаются по типу. Первое устройство возвращает идентификатор карты в виде шестнадцатеричной строки, например:

2E 6F 27 3F

Эта шестнадцатеричная строка преобразуется в десятичную и сохраняется в базе данных. Например, приведенная выше шестнадцатеричная строка преобразуется в это целое число:

779036479

Теперь, когда второе устройство чтения карт читает эту же карту, идентификатор карты представляет собой массив байтов, например, для этой карты:

byte0: 49
byte1: 48
byte2: 53
byte3: 57
byte4: 53
byte5: 52
byte6: 56
byte7: 57
byte8: 55
byte9: 52

Как я могу согласовать эти два серийных номера одной и той же карты друг с другом? Другими словами, я хочу преобразовать этот массив байтов в соответствующий шестнадцатеричный код, чтобы этот шестнадцатеричный код был серийным номером той карты, которую возвращает первое устройство?

Карта Mifare.

2 ответа

Решение

Ответ в том, что второй читатель возвращает закодированные в ASCII десятичные дроби. Ваш номер 1059548974, Это число, закодированное в шестнадцатеричных 3F276F2E если вы используете кодировку Big Endian. Если вы используете кодировку Little Endian, то вы получите 2E6F273F который должен быть вам знаком.

Так:

  1. декодировать возвращенный байтовый массив в ASCII, получая строку "1059548974"
  2. преобразовать эту строку в целое число, используя Convert.ToUInt32(str);
  3. обратить байты в целое число

Вероятно, лучший способ обратить байты - это кусок кода:

public static UInt32 ReverseBytes(UInt32 value)
{
  return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8 |
         (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24;
}

Довольно сложно понять, что именно вы хотите, но в нижней части вы заявляете: "другими словами, я хочу преобразовать этот массив байтов в соответствующий шестнадцатеричный код".

Вы можете выполнить эту операцию следующим образом:

public static string ByteArrayToString(byte[] ba)
{
  StringBuilder sb = new StringBuilder(ba.Length * 2);
  foreach (byte b in ba)
    {
        sb.AppendFormat("{0:x2}", b);
    }
  return sb.ToString();
}

Просто передайте свой байтовый массив, и результатом будет ваше шестнадцатеричное преобразование в строковом формате.

Изменить: Это, вероятно, даст те же результаты, но попробуйте это:

byte[ ] bytes = {0,   1,   2,   4,   8,  16,  32,  64, 128, 255 }
Console.WriteLine( BitConverter.ToString( bytes ) );
Другие вопросы по тегам