You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NetCore读卡器读取卡UID时如何判断返回十六进制值是否反转

读卡器UID反转格式判断方案

不存在通用的跨厂商标准标识,可以直接判定读卡器返回的十六进制UID是否为字节反转格式。
出现反转问题的核心原因是非接卡通信协议(如ISO14443)未强制要求读卡器返回UID时携带字节序标记:部分厂商直接返回射频帧传输的原始字节序(LSB低字节在前),部分厂商返回按逻辑存储顺序排列的UID(MSB高字节在前),完全是厂商自定义实现行为。

可落地的判断/适配方案(适用于C# .NET Core开发场景)

  • 优先方案:设备维度固定规则适配
    这是工业场景误判率为0的方案。提前收集对接的所有读卡器型号,通过读卡器自带的SDK读取设备型号标识,或在系统配置页提供读卡器类型选择项,给每类读卡器提前配置「是否需要反转UID」的固定规则,读卡后直接按规则处理即可,不需要运行时动态判断。
  • 4字节经典M1卡场景:基于BCC校验位自动判断
    常规4字节长度的Mifare Classic卡,UID的第4字节是前3字节的BCC异或校验位,可以通过双向校验自动识别字节序,参考C#实现代码:
using System.Linq;

/// <summary>
/// 自动修正读卡器返回的4字节M1卡UID字节序
/// </summary>
/// <param name="rawUidBytes">读卡器读取到的原始UID字节数组</param>
/// <returns>修正后的正确顺序UID字节数组</returns>
/// <exception cref="InvalidDataException">UID校验不通过,读取异常</exception>
private byte[] Fix4ByteM1UidOrder(byte[] rawUidBytes)
{
    if (rawUidBytes.Length != 4)
        throw new ArgumentException("仅支持4字节长度M1卡UID校验");

    // 校验正序BCC
    byte normalBcc = (byte)(rawUidBytes[0] ^ rawUidBytes[1] ^ rawUidBytes[2]);
    if (normalBcc == rawUidBytes[3])
        return rawUidBytes;

    // 校验反转后BCC
    byte[] reversed = rawUidBytes.Reverse().ToArray();
    byte reversedBcc = (byte)(reversed[0] ^ reversed[1] ^ reversed[2]);
    if (reversedBcc == reversed[3])
        return reversed;

    throw new InvalidDataException("UID校验失败,读取数据异常");
}
  • 7字节/10字节长UID场景:首次校验+配置固化
    长UID不存在固定位置的单字节BCC校验位,无法通过校验值自动判断字节序。这类场景可以在首次接入某型号读卡器时,拿已知UID的测试卡做一次校验,把反转规则写入本地配置,后续同型号设备直接复用配置即可,不要运行时靠数值范围猜测字节序,随机UID、CPU卡内置UID的分布无固定规律,猜测误判率极高。

注意:不要尝试通过UID的数值范围、字符特征判断是否反转,这类判断逻辑在遇到随机UID、定制卡时会出现大量误判。

内容的提问来源于stack exchange,提问作者Crtac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:54:19