我是NFC的新手,我正在开发一个android应用程序来读取和写入NFC中的数据,但我遇到了一些问题。
这是我正在使用的代码(写入(:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
Toast.makeText(this, R.string.message_tag_detected, Toast.LENGTH_SHORT).show();
}
Tag currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] id = currentTag.getId();
String myData = "ABCDEFGHIJKL";
for (String tech : currentTag.getTechList()) {
if (tech.equals(NfcV.class.getName())) {
NfcV tag5 = NfcV.get(currentTag);
try {
tag5.connect();
int offset = 0;
int blocks = 8;
byte[] data = myData.getBytes();
byte[] cmd = new byte[] {
(byte)0x20,
(byte)0x21,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
};
System.arraycopy(id, 0, cmd, 2, 8);
for (int i = 0; i < blocks; ++i) {
cmd[10] = (byte)((offset + i) & 0x0ff);
System.arraycopy(data, i, cmd, 11, 4);
response = tag5.transceive(cmd);
}
}
catch (IOException e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
return;
}
}
}
}
当我在应用TagInfo中读取标签时,输出为:
[00]。41 42 43 44[ABCD]
[01]。42 43 44 45[BCDE]
[02]。43 44 45 46[CDEF]
[03]。44 45 46 47[定义]
[04]。45 46 47 48
[05]。46 47 48 49
[06]。47 48 49 4A[GHIJ]
[07]。48 49 4A 4B
[08]。00 00 00 00[……]
这个输出正确吗?
如果"不是",我哪里错了?
对我来说,这看起来是错误的,但不是NfcV专家只使用NDEF nfc卡。
[00]。41 42 43 44[ABCD]
[01]。45 46 47 48
[02]。49 4A 4B 4C[IJKL]
作为你真正想要做的
我认为问题出在System.arraycopy(data, i, cmd, 11, 4);
上
您正在从源数据数组中复制4个字节的数据,但仅将起始位置增加1个字节,因此下一个块稍后从字母开始。
我认为System.arraycopy(data, i*4, cmd, 11, 4);
会产生你想要的结果。
这样一来,源数据中数组副本的开头将增加已存储的字节数。
由于您有12个字节的数据,每个块存储4个字节,您只需要使用3个块,因此通过设置int blocks = 3;
只循环3次,否则您将耗尽数据,无法复制到cmd中,以发送到从arraycopy
生成IndexOutOfBoundsException
的卡
如果没有4字节的倍数数据,则必须用0填充数据,使其成为4字节的乘积,或者从arraycopy
处理IndexOutOfBoundsException
以正确复制剩余字节。