0

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

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

所以,现在的问题是这两个读卡器读取的同一张卡的类型不同。第一个设备以十六进制字符串形式返回卡 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。

4

2 回答 2

3

答案是第二个阅读器返回的是 ASCII 编码的小数。你的号码是10595489743F276F2E如果您使用 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;
}
于 2013-06-19T21:01:12.527 回答
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 ) );
于 2013-06-18T17:11:03.797 回答