由两个不同的读卡器读取的同一张卡的坐标ID

时间:2013-06-18 16:54:11

标签: c# smartcard mifare cardreader

在软件的一部分中,卡由读卡器读取并分配给用户。而在本软件的其他部分,在同一个读卡器的终端中,读取用户卡并通过卡序列号等从数据库中获取数据。

在该软件的新部分中,有一个带有新读卡器的新终端。从该读卡器读取卡并从数据库等获取数据

所以,现在问题是这两个读卡器读取的同一张卡的类型不同。第一个设备将卡片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。

2 个答案:

答案 0 :(得分:2)

答案是第二个阅读器返回ASCII编码的小数。您的电话号码是1059548974。如果您使用Big Endian编码,则编码为十六进制的此数字为3F276F2E。如果您使用Little Endian编码,那么您将获得2E6F273F,这对您来说应该是熟悉的。

所以:

  1. 将返回的字节数组解码为ASCII,检索字符串"1059548974"
  2. 使用Convert.ToUInt32(str);
  3. 将该字符串转换为整数
  4. 反转整数
  5. 中的字节

    反转字节的最好方法可能是这段代码:

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

答案 1 :(得分:1)

它很难理解你想要什么,但在底部你说:'换句话说,我想把这个字节数组转换成相应的十六进制代码'。

您可以像这样执行该操作:

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 ) );