You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#开发NFC卡GUI:如何编辑字符串并输出可读卡识别结果至文本框

C#实现NFC卡识别信息格式化输出到文本框

我来帮你搞定这个NFC卡信息格式化输出的需求,结合C#的WinForms场景(毕竟你提到了文本框),给你一套实用的实现方案,完全能输出你想要的高可读性格式化结果。

1. 先封装卡信息模型

首先把卡的各项信息封装成一个类,方便后续管理和格式化,避免零散的字符串处理:

public class CardIdentificationInfo
{
    public string CardType { get; set; }
    public string ATQA { get; set; }
    public string UID { get; set; }
    public string SAK { get; set; }
}

2. 实现格式化方法

写一个专门的格式化方法,用StringBuilder来拼接字符串(比直接+拼接高效),完全匹配你要的分隔线+字段分行的样式:

private string FormatCardInfo(CardIdentificationInfo cardInfo)
{
    if (cardInfo == null)
    {
        return "--Card Identification--\nNo card detected.";
    }

    var sb = new StringBuilder();
    sb.AppendLine("--Card Identification--");
    sb.AppendLine(cardInfo.CardType);
    sb.AppendLine($"ATQA: {cardInfo.ATQA ?? "N/A"}");
    sb.AppendLine($"UID: {cardInfo.UID ?? "N/A"}");
    sb.AppendLine($"SAK: {cardInfo.SAK ?? "N/A"}");
    // 可选:如果需要结尾也加分隔线,就加上下面这行
    // sb.AppendLine("--Card Identification--");

    return sb.ToString();
}

3. 结合SendCommand获取数据并输出到文本框

假设你的读卡器操作类有SendCommand方法来获取各项卡信息,我们把获取和输出逻辑整合起来:

// 示例:从读卡器获取卡信息的逻辑,替换成你实际的SendCommand调用和解析逻辑
private CardIdentificationInfo GetCardInfoFromReader()
{
    var cardInfo = new CardIdentificationInfo();

    // 调用SendCommand获取卡类型,比如你设备返回的"MIFARE Ultralight"或"MIFARE Classic 1k"
    cardInfo.CardType = SendCommand("GET_CARD_TYPE"); 
    // 获取ATQA字符串
    cardInfo.ATQA = SendCommand("GET_ATQA");
    // 获取UID字符串
    cardInfo.UID = SendCommand("GET_UID");
    // 获取SAK字符串
    cardInfo.SAK = SendCommand("GET_SAK");

    return cardInfo;
}

// 比如在"读取卡片"按钮点击事件中触发输出
private void btnReadCard_Click(object sender, EventArgs e)
{
    try
    {
        var cardInfo = GetCardInfoFromReader();
        // 确保你的文本框设置了Multiline=true,否则会只显示一行
        txtCardInfo.Text = FormatCardInfo(cardInfo);
    }
    catch (Exception ex)
    {
        txtCardInfo.Text = $"读取卡片出错:{ex.Message}";
    }
}

4. 额外优化提升可读性

  • 文本框设置:在设计器里把文本框的Multiline设为trueScrollBars设为Vertical,字体选等宽字体(比如Consolas),字段对齐会更整齐。
  • 进阶版:如果用RichTextBox,还能给不同字段加颜色区分,可读性更强:
private void FormatCardInfoToRichTextBox(CardIdentificationInfo cardInfo)
{
    rtbCardInfo.Clear();
    // 分隔线用加粗字体
    rtbCardInfo.SelectionFont = new Font("Consolas", 10, FontStyle.Bold);
    rtbCardInfo.AppendText("--Card Identification--\n");
    
    // 卡类型用普通字体
    rtbCardInfo.SelectionFont = new Font("Consolas", 10, FontStyle.Regular);
    rtbCardInfo.AppendLine(cardInfo.CardType);
    
    // ATQA用深蓝色
    rtbCardInfo.SelectionColor = Color.DarkBlue;
    rtbCardInfo.AppendLine($"ATQA: {cardInfo.ATQA ?? "N/A"}");
    
    // UID用深绿色
    rtbCardInfo.SelectionColor = Color.DarkGreen;
    rtbCardInfo.AppendLine($"UID: {cardInfo.UID ?? "N/A"}");
    
    // SAK用深红色
    rtbCardInfo.SelectionColor = Color.DarkRed;
    rtbCardInfo.AppendLine($"SAK: {cardInfo.SAK ?? "N/A"}");
    
    // 结尾分隔线还原样式
    rtbCardInfo.SelectionFont = new Font("Consolas", 10, FontStyle.Bold);
    rtbCardInfo.SelectionColor = Color.Black;
    rtbCardInfo.AppendText("--Card Identification--");
}

这样实现后,输出的效果完全符合你给出的示例,结构清晰、可读性拉满,还能灵活扩展其他卡类型的处理。

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

火山引擎 最新活动