【问题标题】:Android NFC Tag String ComparisonAndroid NFC 标签字符串比较
【发布时间】:2013-03-25 00:08:53
【问题描述】:

我在比较两个字符串时遇到问题,一个来自 NFC 标签,另一个来自 xml 文件。 我用来编写标签的代码如下所示:

   private NdefMessage getTagAsNdef(Card new_card) 
    {
        boolean addAAR = false;
        String unique_id = new_card.getCardId();       
        byte[] bytes = unique_id.getBytes(Charset.forName("UTF-8"));
        byte[] payload = new byte[bytes.length + 1]; 
        NdefRecord rtdUriRecord = new NdefRecord(
        NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], payload);
        if(addAAR) 
        {
            NdefRecord new_record = null;
            try 
            {
                new_record = createRecord(new_card);
            } catch (UnsupportedEncodingException e) 
            {
                e.printStackTrace();
            }
            return new NdefMessage(new NdefRecord[] {rtdUriRecord, new_record}); 
        } else 
        {
            return new NdefMessage(new NdefRecord[] 
        {
                rtdUriRecord});
        }
    }

我尝试按照此处的建议删除通常在有效负载中设置的所有语言和编码信息: Comparing Data Read from NFC Tag 尽管在日志中打印的字符串值相同,但我在阅读标签后在这里进行的比较总是失败:

looking at this_card_id -6465415649291849135
      compare to tag_id -6465415649291849135

我得到了字符串的长度来显示问题:

looking at this_card_id 20
      compare to tag_id 21

所以标签 id 有一个我一直无法摆脱的隐藏字符。 这是比较的代码:

private void associateWithCardsFile(String tag_id)
{
    String method = "associateWithCardsFile";
    Log.i(DEBUG_TAG, method+" tag_id "+tag_id);
    tag_id.trim();
    boolean found = false;
    Enumeration e = cards.keys();
    Log.i(DEBUG_TAG, method+" cards "+cards.size());
    while (e.hasMoreElements())
    {
        String this_card_id = (String)e.nextElement();
        this_card_id.trim();
        Log.i(DEBUG_TAG, method+" looking at this_card_id "+this_card_id.length());
        Log.i(DEBUG_TAG, method+"       compare to tag_id "+tag_id.length());
        String card_id_str = UtilityTo.encodeThisString(this_card_id, "UTF-8");
        String tag_id_str = UtilityTo.encodeThisString(tag_id, "UTF-8");
        if (card_id_str.equals(tag_id_str))
        {
            Card matching_card = cards.get(this_card_id);
            String word = UtilityTo.getWord(matching_card);
            Toast.makeText(this, word, Toast.LENGTH_LONG ).show();
            Log.i(DEBUG_TAG, method+" 1 match"+matching_card.getText()+" "+matching_card.getDefinition()+" "+matching_card.getWordType());
            turn_cards.add(matching_card);
            found = true;
            showCards();
            break;
        }
    }
    if (!found)
    {
        Toast.makeText(this, "Not a game card!", Toast.LENGTH_LONG ).show();
        Log.i(DEBUG_TAG, method+" card not found");
    }
}

在 UtilityTo 类中,我有这个方法非常适合使用外语。

public static String encodeThisString(String original_value, String encoding)
{
    try
    {
        byte[] utf8Bytes = original_value.getBytes(encoding);
        String new_value = new String(utf8Bytes, encoding);
        return new_value;
    } catch (UnsupportedEncodingException e)
    {
        e.printStackTrace();
        return null;
    } catch (java.lang.NullPointerException n)
    {
        n.printStackTrace();
        return null;
    }
}

我还尝试了 StackOverflow 的一些建议,如下所示:tag_id_str = new String(tag_id.getBytes("UTF-8"), "ascii") 无济于事。
有人可以解释如何编写标签以便没有隐藏的字符并且基本的字符串比较将起作用,或者如何修改标签中的字符串使其等同于具有相同数字的字符串。 谢谢。

附言 这是我在写完这篇文章后开始使用的 Android Developer NFC Basics 中的 write 方法。它会导致与上述相同的问题:tag_id 比 xml 文件中的 card_id 长 1 个字符。

public NdefRecord createRecord(String payload) 
{
    String language = "en";
    boolean encodeInUtf8 = true;
    byte[] langBytes = language.getBytes(Charset.forName("US-ASCII"));
    Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
    byte[] textBytes = payload.getBytes(utfEncoding);
    int utfBit = encodeInUtf8 ? 0 : (1 << 7);
    char status = (char) (utfBit + langBytes.length);
    byte[] data = new byte[1 + langBytes.length + textBytes.length];
    data[0] = (byte) status;
    System.arraycopy(langBytes, 0, data, 1, langBytes.length);
    System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
    NdefRecord.RTD_TEXT, new byte[0], data);
    return record;
}

【问题讨论】:

    标签: string tags comparison nfc


    【解决方案1】:

    试试这个TextRecord 看看是否能解决您的问题。可能您的编码/解码文本记录不正确。

    【讨论】:

    • 感谢托马斯的帮助。由于我对 NFC 的需求非常简单,并且我几乎完成了读写方法,因此我最终能够解决问题。 NDF 工具看起来是个不错的选择。如果我从头开始,我可能会通过使用它节省一些时间。
    【解决方案2】:

    由于我只在每个标签上存储一个 long,所以我做了一个方法来从标签消息中排除所有其他字符。 现在我可以将标签 id 字符串与 xml 文件中的 id 字符串进行比较。

    private String removeHiddenCharacters(String message)
    {
      String dash = "-";
      char d = dash.charAt(0);
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < message.length(); i++)
      {
        char c = message.charAt(i);
        if (Character.isDigit(c))
        {
            sb.append(c);
        } else if (c == d)
        {
            sb.append(d);
        }
      }
      String result = new String(sb);
      Log.i(DEBUG_TAG, " result "+result);
      return result;
    }
    

    【讨论】:

    • 你考虑过外部类型记录吗?它的有效载荷是一个(任何)字节数组,因此问题的来源会更少。
    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多