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设为true,ScrollBars设为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




