Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个不同读卡器读取的同一卡的坐标Id_C#_Smartcard_Mifare_Cardreader - Fatal编程技术网

C# 两个不同读卡器读取的同一卡的坐标Id

C# 两个不同读卡器读取的同一卡的坐标Id,c#,smartcard,mifare,cardreader,C#,Smartcard,Mifare,Cardreader,在软件的一部分中,卡片由读卡器读取并分配给用户。在该软件的另一部分,在同一个读卡器的终端中,用户卡被读取,并通过卡序列号等从数据库中获取数据 在该软件的一个新部分中,有一个带有新读卡器的新终端。从该读卡器读取卡,并从数据库等获取数据 所以,现在的问题是,这两个读卡器读取的同一张卡的类型不同。第一个设备以十六进制字符串的形式返回卡id,如下所示: 2E 6F 27 3F 此十六进制字符串转换为十进制并存储在数据库中。例如,将上述十六进制字符串转换为以下整数: 779036479 现在,当第二个

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

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

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

很难准确理解您想要的是什么,但在底部您声明:“换句话说,我想将这个字节数组转换为相应的十六进制代码”

您可以这样执行该操作:

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

很难确切地理解您想要什么,但在底部您声明:“换句话说,我想将这个字节数组转换为相应的十六进制代码”

您可以这样执行该操作:

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

答案是第二个读取器返回ASCII编码的小数。您的号码是
1059548974
。如果使用Big-Endian编码,这个编码为十六进制的数字是
3F276F2E
。如果您使用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;
    }
    
    公共静态UInt32反向字节(UInt32值)
    {
    返回值(value&0x000000FFU)8 |(value&0xFF000000U)>>24;
    }
    
    答案是第二个读取器返回ASCII编码的小数。您的号码是
    1059548974
    。如果使用Big-Endian编码,这个编码为十六进制的数字是
    3F276F2E
    。如果您使用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;
    }
    
    公共静态UInt32反向字节(UInt32值)
    {
    返回值(value&0x000000FFU)8 |(value&0xFF000000U)>>24;
    }
    
    谢谢,您的代码将返回以下字符串:3b303539353438393734,但这不等于2E 6F 27 3F。值3b303539353438393734是由代码获得的卡id的十六进制。该卡从第二个设备读取,而值2E 6F 27 3F是从第一个设备读取的卡id的十六进制数。为了在两个不同的读卡器之间进行同步,这两个值必须相等。当字节数组不等于十六进制值时。请参阅,一张卡由两个不同的读卡器读取。但是读卡器获取的这张卡的Id是不同的。我想通过此读卡器为同一张卡获取一个Id。谢谢,您的代码确实已将字节数组转换为十六进制,但十六进制结果必须等于第一个读卡器的卡Id的十六进制结果,然后必须有不同的内容。可能是软件2获取十六进制的方式。我建议在这一点上做一些逆向工程,看看软件是如何得到十六进制的。谢谢,您的代码将返回以下字符串:3b303539353438393734,但这并不等于2E 6F 27 3F。值3b303539353438393734是由代码获得的卡id的十六进制。该卡从第二个设备读取,而值2E 6F 27 3F是从第一个设备读取的卡id的十六进制数。为了在两个不同的读卡器之间进行同步,这两个值必须相等。当字节数组不等于十六进制值时。请参阅,一张卡由两个不同的读卡器读取。但是读卡器获取的这张卡的Id是不同的。我想通过此读卡器为同一张卡获取一个Id。谢谢,您的代码确实已将字节数组转换为十六进制,但十六进制结果必须等于第一个读卡器的卡Id的十六进制结果,然后必须有不同的内容。可能是软件2获取十六进制的方式。我建议在这一点上做一些逆向工程,看看软件是如何得到十六进制的。可能是盐腌的。