Координатный идентификатор одной и той же карты, которую читают два разных устройства чтения карт
В части программного обеспечения карта считывается устройством чтения карт и выделяется пользователю. А в другой части этого программного обеспечения, в терминале с тем же устройством чтения карт, пользовательская карта считывает и извлекает данные из базы данных по серийному номеру карты и т. Д.
В новой части этого программного обеспечения появился новый терминал с новым кард-ридером. карта считывается с этого устройства чтения карт и извлекает данные из базы данных и т. д.
Итак, теперь проблема в том, что одна и та же карта, которую читают эти два устройства чтения карт, различаются по типу. Первое устройство возвращает идентификатор карты в виде шестнадцатеричной строки, например:
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
который должен быть вам знаком.
Так:
- декодировать возвращенный байтовый массив в ASCII, получая строку
"1059548974"
- преобразовать эту строку в целое число, используя
Convert.ToUInt32(str);
- обратить байты в целое число
Вероятно, лучший способ обратить байты - это кусок кода:
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 ) );