C# 两个不同读卡器读取的同一卡的坐标Id
在软件的一部分中,卡片由读卡器读取并分配给用户。在该软件的另一部分,在同一个读卡器的终端中,用户卡被读取,并通过卡序列号等从数据库中获取数据 在该软件的一个新部分中,有一个带有新读卡器的新终端。从该读卡器读取卡,并从数据库等获取数据 所以,现在的问题是,这两个读卡器读取的同一张卡的类型不同。第一个设备以十六进制字符串的形式返回卡id,如下所示:C# 两个不同读卡器读取的同一卡的坐标Id,c#,smartcard,mifare,cardreader,C#,Smartcard,Mifare,Cardreader,在软件的一部分中,卡片由读卡器读取并分配给用户。在该软件的另一部分,在同一个读卡器的终端中,用户卡被读取,并通过卡序列号等从数据库中获取数据 在该软件的一个新部分中,有一个带有新读卡器的新终端。从该读卡器读取卡,并从数据库等获取数据 所以,现在的问题是,这两个读卡器读取的同一张卡的类型不同。第一个设备以十六进制字符串的形式返回卡id,如下所示: 2E 6F 27 3F 此十六进制字符串转换为十进制并存储在数据库中。例如,将上述十六进制字符串转换为以下整数: 779036479 现在,当第二个
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
因此:
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
因此:
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获取十六进制的方式。我建议在这一点上做一些逆向工程,看看软件是如何得到十六进制的。可能是盐腌的。