- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当使用 Android 读取 MIFARE 卡并将数据转换为 UTF-8 时,我会收到类似 � 的奇怪字符。我正在尝试构建一个可以读取我们正在使用的某种身份证的应用程序。现在的问题是我在单词之间得到奇怪的字符,并且一些单词在 block 之间分开,所以我怎样才能安全地得到我正在寻找的单词?例如我的读数是这样的:
43224...19032019...在 block 2 sektor 2 bindex :8
并且以 19 开头的其余数字在新 block 中进行拆分:
我的名字����M����19
在 block 1 sektor 1 bindex :4
930402......NO934951
在 block 2 sektor 1 bindex :4
c5 42 4e 49 44 00 07 4f 4f 4f 4f 4f 4f 00 4b 42 "Åbnid" "OOOOOO" "KB"44 44 44 20 44 44 44 44 44 00 82 4d 00 c9 31 39 "DDD DDDDD" "M" "19"39 34 34 33 34 32 00 d0 4e 4f 39 36 36 36 35 31 "944342" "NO966651"00 00 00 00 00 00 70 f7 88 00 00 00 00 00 00 0030 32 32 20 20 41 53 00 d3 54 4f 54 41 4c 20 4b "022" "AS" "Total k"4f 4e 54 52 4f 4c 4c 20 41 53 20 00 c9 30 32 38 "ONTROLL AS" "028"37 30 34 33 33 00 c9 32 30 32 31 30 32 31 31 00 "70433" "20210211"00 00 00 00 00 00 70 f7 88 00 00 00 00 00 00 00
This is how I read from the card:
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
MifareClassic mfc = MifareClassic.get(tagFromIntent);
这是我用于在 for 循环中读取的代码:
data = mfc.readBlock(bIndex + block);
然后为了将数据转换为 UTF8 以进行打印,我使用:
public String convertByteArrayToUTF8(byte[] bytes){
String encoded = null;
try {
encoded = new String(bytes, StandardCharsets.UTF_8);
}
catch (Exception e){
encoded = new String(bytes, Charset.defaultCharset());
}
return encoded;
}
我尝试过使用 ASCII、UTF-16 等,但没有成功。
最佳答案
首先对问题标题大声笑。当我是新手时,我处于同样的情况。没有在线教程可以为您提供从 Mifare 经典卡读取数据的确切代码。
先了解一下Mifare卡的内存结构。
Mifare Classic的内存分为扇区,扇区也分为16字节的 block 。
MIFARE Classic 1K 卡有 16 个扇区,每个扇区分为四个 block 。如果我们进行数学计算,我们可以算出内存结构是怎样的:16 字节(1 block )* 4 block * 16 扇区 = 1024 字节。
MIFARE Classic 4K 卡有 40 个扇区,其中 32 个扇区分为 4 个 block ,其余 8 个扇区分为 16 个 block 。 16字节(1 block )*4 block *32扇区+16字节(1 block )*16 block *8扇区=4096字节。内存结构如下:
方 block 上的数字表示其索引。每个扇区都由写在扇区最后一个 block 中的站点 key 保护。例如, block 3 包含扇区 1 的站点 key , block 7 包含扇区 2 的站点 key 。每个扇区中的最后一个 block 还包含访问条件信息,例如“写入”、“读取”和“读写”。下图演示了最后一个 block 是如何组成的:
此外,写入卡中的数据是二进制的,即; 0 和 1。
现在,读取数据需要遵循的步骤是:
第一步:检查设备是否支持NFC。
step2:检查设备是否有NXP芯片(尤其是读取Mifare classic卡)。
step3: 实例化NFC manager和NFC adpater & 定义你想要读取的卡的techlist。
第 4 步:请求访问设备 NFC 的权限。
step5:创建一个检测卡片的intent,指定要读取的MIME类型(大多数情况下都是MIME类型)。
step6: 在 onResume() 和 onPause() 中启用和禁用适配器的前台调度,以便您的应用程序在您的 Activity 处于前台时优先读取卡片。
step7:当卡片接触到设备时,您可以从intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
step8:读取卡片信息即;卡片类型、技术列表等。
step9:要读取卡片中的数据,需要通过上面获取到的标签信息连接卡片。
step10:遍历所有扇区。使用默认 key 验证每个扇区//https://developer.android.com/reference/android/nfc/tech/MifareClassic.html#authenticateSectorWithKeyA(int,%20byte[])
step11:认证成功后,读取每个扇区 block 中的二进制数据。
step12:将二进制数据转换为字符串数据,以便我们读取。
step13:到此为止,对数据做任何你想做的事情。
惊喜!在我的 github 存储库中获取完整的工作代码: https://github.com/codes29/RFIDReader
注意:我理解你作为新手的感受,并在没有适当教程的情况下完成了这项任务。因此,经过几天的努力,我更新了我编写的代码。
这是在成功验证并读取数据后您将获得的样本。我扫描的卡现在是空的。但如果这里有数据,那么它肯定会在这里而不是 0。
干杯!兄弟,祝你编程愉快!
关于android - 读取 Mifare Classic 返回奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782247/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
为什么在 C# 中添加两个 char 结果是 int 类型? 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr 变量变为 int 类型。我希望它是
下面的代码可以编译,但 char 类型的行为与 int 类型的行为不同。 特别是 cout ::ikIsX >() ::ikIsX >() ::ikIsX >() using names
我正在寻找一个正则表达式,它可以匹配长度为 1 个或多个字符但不匹配 500 的内容。这将在 Rails 路由文件中使用,特别是用于处理异常。 路线.rb match '/500', to: 'err
对于 C 编程作业,我正在尝试编写几个头文件来检查所谓的“X 编程语言”的语法。我最近才开始,正在编写第一个头文件。这是我编写的代码: #ifndef _DeclarationsChecker_h_
为什么扩展的 ascii 字符(â、é 等)被替换为 字符? 我附上了一张图片...但我正在使用 PHP 从 MySQL 中提取数据,其中一些位置有扩展字符...我使用的是 Arial 字体。 您可以
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
如何将 ANSI 字符 (char) 转换为 Unicode 字符 (wchar_t),反之亦然? 是否有用于此目的的任何跨平台源代码? 最佳答案 是的,在 中你有mbstowcs()和 wcsto
函数 fromCharCode 不适用于国际 ANSI 字符。例如,对于 ID 为 192 到 223 的俄语 ANSI (cp-1251) 字符,它返回特殊字符。如何解决这个问题? 我认为,需要将A
如果不喜欢,我想隐藏 id,但不起作用 SELECT * FROM character, character_actor WHERE character.id NOT LIKE character_a
现在这个程序成功地反转了键盘输入的单词。但是我想在我反转它之前“保存”指针中的单词,所以我可以比较两者,反转的和“原始的”,并检查它们是否是回文。我还没有太多经验,可能会出现比我知道的更多的错误,但我
Memcpy 和 memcmp 函数可以接受指针变量吗? char *p; char* q; memcpy(p,q,10); //will this work? memcmp(p,q,10); //w
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题: 使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成
我有一个奇怪的问题。我需要从 stat 命令打印输出字符串。 我已经编写了获取一些信息的代码。 import glob import os for file in glob.glob('system1
我正在使用 Java 并具有其值如下所示的字符串, String data = "vale-cx"; data = data.replaceAll("\\-", "\\-\\"); 我正在替换其中的“
String urlParameters = "login=test&password=te&ff"; 我有一个String urlParams,& - 是密码的一部分,如何使其转义,从而不被识别为分
大家好,我只想从此字符串中提取第一个字母: String str = "使 徒 行 傳 16:31 ERV-ZH"; 我只想获取这些字符: 使 徒 行 傳 并且不包括 ERV-ZH 仅数
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
所以, 我有一个字符**;它本质上是一个句子,带有指向该句子中每个单词的指针;即 'h''i''\0''w''o''r''l''d''\0''y''a''y''!''\0' 在这种情况下,我希望使用可
这个问题在这里已经有了答案: Using quotation marks inside quotation marks (12 个答案) 关闭 7 年前。 如何打印 " 字符? 我知道打印 % 符号
我是一名优秀的程序员,十分优秀!