在软件的一部分中,卡由读卡器读取并分配给用户。而在本软件的其他部分,在同一个读卡器的终端中,读取用户卡并通过卡序列号等从数据库中获取数据。
在该软件的新部分中,有一个带有新读卡器的新终端。从该读卡器读取卡并从数据库等获取数据
所以,现在问题是这两个读卡器读取的同一张卡的类型不同。第一个设备将卡片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。
答案 0 :(得分:2)
答案是第二个阅读器返回ASCII编码的小数。您的电话号码是1059548974
。如果您使用Big Endian编码,则编码为十六进制的此数字为3F276F2E
。如果您使用Little Endian编码,那么您将获得2E6F273F
,这对您来说应该是熟悉的。
所以:
"1059548974"
Convert.ToUInt32(str);
反转字节的最好方法可能是这段代码:
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 ) );