读取NFC标签时出现奇怪字符

读取NFC标签时出现奇怪字符,第1张

概述我正在尝试使用Android读取NFC标签.我是养蜂人,当我接近他们时,这是为了识别我的蜂箱.我在这里搜索过,但是在阅读标签时仍然遇到问题.我想阅读文本,但是当阅读时,有一个正方形字符,并且在所需文本之前显示的字符类似“十”.这是我正在使用的代码.我知道有效负载字节必须正确,并且

我正在尝试使用Android读取NFC标签.我是养蜂人,当我接近他们时,这是为了识别我的蜂箱.我在这里搜索过,但是在阅读标签时仍然遇到问题.我想阅读文本,但是当阅读时,有一个正方形字符,并且在所需文本之前显示的字符类似“十”.

这是我正在使用的代码.我知道有效负载字节必须正确,并且我尝试更改它们但无济于事.

private static NdefMessage getTestMessage() {    byte[] mimeBytes = "application/com.androID.cts.verifIEr.nfc"            .getBytes(Charset.forname("US-ASCII"));    byte[] ID = new byte[] {1, 3, 3, 7};    byte[] payload = "CTS VerifIEr NDEF Push Tag".getBytes(Charset.forname("US-ASCII"));    return new NdefMessage(new NdefRecord[] {            new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, ID, payload)    });}@OverrIDeprotected voID onResume() {    super.onResume();    mNfcAdapter.enableForegrounddispatch(this, mPendingIntent, null, null);    mNfcAdapter.setNdefPushMessageCallback(this, this);}// sending message@OverrIDepublic NdefMessage createNdefMessage(NfcEvent event) {    return getTestMessage();}private NdefMessage[] getNdefMessages(Intent intent) {    Parcelable[] rawMessages = intent      .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);    if (rawMessages != null) {        NdefMessage[] messages = new NdefMessage[rawMessages.length];        for (int i = 0; i < messages.length; i++) {            messages[i] = (NdefMessage) rawMessages[i];        }        return messages;    } else {        return null;    }}static String displayByteArray(byte[] bytes) {    String res="";    StringBuilder builder = new StringBuilder().append("");    for (int i = 0; i < bytes.length; i++) {        res+=(char)bytes[i];    }    return res;}// displaying message@OverrIDeprotected voID onNewIntent(Intent intent) {    super.onNewIntent(intent);    NdefMessage[] messages = getNdefMessages(intent);    edtUser.setText(displayByteArray(messages[0].toByteArray()));    Toast.makeText(this, "NFC tag entered", Toast.LENGTH_LONG).show();}

解决方法:

由于您尝试将整个原始NDEF记录显示为文本字符串(使用某种奇数解码方法),因此在显示消息时,您将得到奇数个附加字符:

NdefMessage[] messages = getNdefMessages(intent);edtUser.setText(displayByteArray(messages[0].toByteArray()));

这有几个问题.首先,您通常希望使用与编写文本相同的编码来解码文本.例如,如果您使用

String text = "...";byte[] bytes = text.getBytes(Charset.forname("US-ASCII"));

要获得给定文本字符串的US-ASCII编码字节数组,您还希望使用相同的US-ASCII编码再次将字节转换为文本字符串:

byte[] bytes = ...;String text = new String(bytes, "US-ASCII");

其次,您将整个NDEF消息解释为文本字符串.但是,您存储在标签上的文本通常仅包含在NDEF记录的有效载荷之内.在您的情况下,前缀“十”表示您使用的语言指示为“ en”的NFC论坛文本记录(类型名称“ T”)(对于英语).因此,您需要在NDEF消息中搜索文本记录:

for (NdefRecord r : messages[0].getRecords()) {    if (r.getTnf() == NdefRecord.TNF_WELL_KNowN) {        if (Arrays.equals(r.getType(), NdefRecord.RTD_TEXT)) {

一旦找到了文本记录,就可以对其文本有效载荷进行解码.有效负载由状态字节,语言字段和实际文本组成:

            byte[] payloadBytes = ndefRecord.getPayload();            boolean isUTF8 = (payloadBytes[0] & 0x080) == 0;  //status byte: bit 7 indicates enCoding (0 = UTF-8, 1 = UTF-16)            int languageLength = payloadBytes[0] & 0x03F;     //status byte: bits 5..0 indicate length of language code            int textLength = payloadBytes.length - 1 - languageLength;            String languageCode = new String(payloadBytes, 1, languageLength, "US-ASCII");            String payloadText = new String(payloadBytes, 1 + languageLength, textLength, isUTF8 ? "UTF-8" : "UTF-16");            edtUser.setText(payloadText);        }    }}
总结

以上是内存溢出为你收集整理的读取NFC标签时出现奇怪字符全部内容,希望文章能够帮你解决读取NFC标签时出现奇怪字符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存