gpt4 book ai didi

安卓 NFC : 'd' prepended on NDEF payload

转载 作者:行者123 更新时间:2023-11-29 19:44:03 25 4
gpt4 key购买 nike

我有一个应用程序可以读取 MIFARE Ultralight 标签上 NDEF 记录的负载。

payload打包成NDEF Text记录,text值格式如下:

1,10,200,Arthur smith

所以总是有 3 个逗号分隔 3 个数字和名称。

我使用 NXP TagWriter 来格式化标签,我的应用程序可以正确读取有效负载。问题是我工作的公司使用了一个单独的公司来为我们格式化标签。现在,当我的应用程序扫描这些标签时出现了问题。有效载荷然后读取:

d1,10,200,Arthur smith

这会导致我的应用无法处理标签。

NXP 应用程序可以成功读取标签,如果我使用 NXP TagWriter 使用相同的数据重新格式化标签,那么我的应用程序将正确读取标签。

当有效载荷来自只有我的应用程序可以看到的格式化公司时,似乎在有效载荷前面有一个“d”。

有人知道“d”是什么以及我该如何解决这个问题吗?

这是我用来读取有效负载的代码:

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(i.getAction()) || NfcAdapter.ACTION_TAG_DISCOVERED.equals(i.getAction())) {
if(NfcScannerApplication.isCanScanNfcTag() == true){
messages = i.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (messages != null) {
//setContentView(R.layout.successfulnfc);
NfcScannerApplication.startNfcTimer();
//Toast.makeText(this, "NFC timer set", Toast.LENGTH_LONG).show();
Log.e(TAG, "Found " + messages.length + " NDEF messages"); // is almost always just one
vibrate(); // signal found messages :-)

// parse to records
for (int i = 0; i < messages.length; i++) {
List<Record> records = null;
try {
records = new Message((NdefMessage)messages[i]);
} catch (FormatException e) {
e.printStackTrace();
}
Log.e(TAG, "Found " + records.size() + " records in message " + i);

for(int k = 0; k < records.size(); k++) {
Log.e(TAG, " Record #" + k + " is of class " + records.get(k).getClass().getSimpleName());

Record record = records.get(k);
NdefRecord ndefRecord = record.getNdefRecord();
byte[] arr = ndefRecord.getPayload();

String payload = new String(arr);

if(payload.length() > 0){
payload = payload.substring(3, payload.length());

Log.e(TAG, "payload = " + payload);

int counter = 0;
for( int z = 0; z < payload.length(); z++ ) {
if( payload.charAt(z) == ',' ) {
counter++;
}
}

if(counter == 3){
//Toast.makeText(this, "comma count = 3 ", Toast.LENGTH_SHORT).show();
String[] splitPayload = payload.split(",");
String tagType = splitPayload[0];
String tagCompany = splitPayload[1];
String tagClientID = splitPayload[2];
String tagClientName = splitPayload[3];

最佳答案

您的代码没有正确解码 NDEF 文本记录的负载。您假设有效负载是 UTF-8 编码的(Android 上的默认编码)并且实际文本值从该解码字符串的偏移量 3 开始:

NdefRecord ndefRecord = record.getNdefRecord();
byte[] arr = ndefRecord.getPayload();
String payload = new String(arr);
payload = payload.substring(3, payload.length());

但是,这些假设是错误的。文本记录由状态字节组成,后跟可变(!)长度语言代码(US-ASCII 编码)和文本值本身(以 UTF-8 或 UTF-16 编码)。因此,您看到的附加“d”实际上可能是语言代码的一部分,或者可能是将不正确的字符代码(例如,状态字节的值)解码为 UTF-8 字符串的结果。

因此,为了得到文本值,首先要在Status字节中找到语言代码的长度和文本值的编码:

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");

关于安卓 NFC : 'd' prepended on NDEF payload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38148250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com