簡體   English   中英

由兩個不同的讀卡器讀取的同一張卡的坐標ID

[英]Coordinate Id of same card that is read by two different card readers

在軟件的一部分中,卡由讀卡器讀取並分配給用戶。 而在該軟件的其他部分中,在同一讀卡器的終端中,將通過卡序列號等讀取用戶卡並從數據庫中獲取數據。

在該軟件的新部分中,有一個帶有新讀卡器的新終端。 從此讀卡器讀取卡,並從數據庫等中獲取數據。

因此,現在的問題是,這兩個讀卡器讀取的同一張卡的類型不同。 第一個設備返回卡ID為十六進制字符串,如下所示:

2E 6F 27 3F

該十六進制字符串將轉換為十進制並存儲在數據庫中。 例如,上面的十六進制字符串將轉換為該整數:

779036479

現在,當第二個讀卡器讀取同一張卡時,卡ID是一個字節數組,類似於該卡的字節:

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

如何將同一張卡的兩個序列號相互協調? 換句話說,我想將此字節數組轉換為相應的十六進制代碼,以便此十六進制代碼是返回第一個設備的那張卡的序列號?

該卡是Mifare。

答案是第二個閱讀器正在返回ASCII編碼的小數。 您的電話號碼是1059548974 如果使用Big Endian編碼,則編碼為十六進制的數字為3F276F2E 如果您使用Little Endian編碼,那么您會得到2E6F273F ,它應該是您熟悉的。

所以:

  1. 將返回的字節數組解碼為ASCII,檢索字符串"1059548974"
  2. 使用Convert.ToUInt32(str);將該字符串轉換為整數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數組,結果將是字符串格式的十六進制轉換。

編輯:這可能會產生相同的結果,但是請嘗試以下操作:

byte[ ] bytes = {0,   1,   2,   4,   8,  16,  32,  64, 128, 255 }
Console.WriteLine( BitConverter.ToString( bytes ) );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM