C# RFID——领先的零问题

C# RFID——领先的零问题,c#,ios,xamarin.ios,rfid,linea-pro,C#,Ios,Xamarin.ios,Rfid,Linea Pro,我正在使用开发一个Xamarin.iOS应用程序,它可以扫描条形码、RFID卡和磁卡。我已经具备了基本的RFID功能,并且我关心的线性数据是卡的UID(字节数组) 在我们与web服务器交互的应用程序中,我们用来识别这些卡的格式是十进制的,因此我有以下代码将UID字节数组转换为我们需要的十进制字符串: //附加到LineaPro调用的RFID扫描事件的处理程序 无效句柄FIDSCANNED(DTDeviceDelegate调度程序、RFIDScannedEventArgs参数) { if(Argu

我正在使用开发一个Xamarin.iOS应用程序,它可以扫描条形码、RFID卡和磁卡。我已经具备了基本的RFID功能,并且我关心的线性数据是卡的UID(字节数组)

在我们与web服务器交互的应用程序中,我们用来识别这些卡的格式是十进制的,因此我有以下代码将UID字节数组转换为我们需要的十进制字符串:

//附加到LineaPro调用的RFID扫描事件的处理程序
无效句柄FIDSCANNED(DTDeviceDelegate调度程序、RFIDScannedEventArgs参数)
{
if(Arguments==null | | | Arguments.Data==null | | | Arguments.Data.UID==null)
无效扫描();
其他的
{
byte[]SerialArray=新字节[Arguments.Data.UID.Length];
System.Runtime.InteropServices.Marshal.Copy(Arguments.Data.UID.Bytes,SerialArray,0,SerialArray.Length);
字符串Hex=Util.ByteArrayToHexString(串行数组);
if(string.IsNullOrWhiteSpace(十六进制))
无效扫描();
其他的
{
string DecimalSerial=ulong.Parse(Hex,System.Globalization.NumberStyles.HexNumber).ToString();
有效数字(十进制序列);
}
}
//断开卡的连接,以便扫描另一张卡
NSError RFDisconnectError;
LineaPRO.Shared.Device.RfRemoveCard(Arguments.CardIndex,out RFDisconnectError);
}
//字节数组到十六进制字符串的转换
公共静态字符串ByteArrayToHexString(字节[]字节)
{
StringBuilder十六进制=新的StringBuilder();
foreach(字节中的字节b)
十六进制格式(“{0:x2}”,b);
返回hex.ToString();
}
然而,我发现我们已经发行的一些RFID卡存在一个非常令人担忧的问题。我们有各种各样的卡片,不同的样式和ISO标准,移动应用程序需要扫描。其中一个(我相信Mifare经典标准,尽管我目前无法确认)始终是来自该特定RFID卡提供商的10位数字,尽管其中一些以数字0开头,如图所示:

这导致了字节数组转换的一个大问题,因为十六进制字符串被解析为无符号长类型,前导零被删除。我们在一个单独的应用程序中使用另一组USB RFID读卡器,以便将这些RFID卡ID存储到数据库中,尽管这些USB读卡器能够以某种方式拾取前导零

因此,在使用移动应用程序时会出现冲突,其中UID的前导零会被删除,因为传递给API的数据会根据数据库进行检查,然后由于缺少零而被视为不匹配

我已经查看了LineaPro在我的事件处理程序中接收到的所有数据,字节数组是唯一保存卡UID的东西,因此只要我们使用UID的十进制表示,移动应用程序就无法确定是否应该存在零,除非:

  • 也许某些RFID标准对UID十进制表示中的位数有特定限制?例如,如果这种类型的卡总是有偶数或特定数量的十进制数字,我可以在必要时用额外的零填充字符串

  • LineaPro只是没有提供足够的数据,在这种情况下,我可能就完蛋了


  • 你没有足够的信息来解决你的问题。如果ID号始终假定为10位数字,那么根据需要使用格式字符串添加前导零就很简单了

    我想说,试着总是用前导零填充UID到10位,然后通过它运行大量测试值


    正如您所说,如果您的设备从ID的开头删除了有效数据,那么您就完蛋了。

    我发现,我们的USB RFID读卡器使用的特定配置设置,以及从供应商处收到的卡的格式,都是罪魁祸首。以下是我们用于USB读卡器的配置的屏幕截图:


    我们将它们设置为在读取、填充较短ID和截断较长ID时强制使用10位数的十进制UID。我已经通知其他开发人员,读取这些ID的正确方法应该是正确的十六进制格式,没有特定的长度,以便支持没有任何硬编码ID格式的其他RFID卡类型。

    问题是我不能保证每个RFID卡都有10位长。据我所知,只有这家制造商的产品才有10位ID。