我编写了一个小函数来将原始数据格式化为NDEF,然后将其写入标记。
该函数的主要部分没有任何问题,唯一不起作用的是它保持写入0xFF到扇区的末尾而不是0x00,如果它是空的。
代码:
int write_ndef(FreefareTag tag, uint8_t *data, const uint8_t type, size_t isize) {
uint8_t *ndef_msg;
size_t ndef_msg_len;
int sector_count;
ndef_msg = data;
ndef_msg_len = isize;
uint8_t write_data [4];
printf("Printing raw message :\n");
print_hex(ndef_msg, ndef_msg_len);
size_t encoded_size;
uint8_t *tlv_data = tlv_encode(type, ndef_msg, ndef_msg_len, &encoded_size);
printf("NDEF file is %zu bytes long.\n", encoded_size);
printf("Printing NDEF formatted message :\n");
print_hex(tlv_data, encoded_size);
sector_count = encoded_size / 4;
if((encoded_size%4)!= 0)
sector_count++;
for (size_t i = 0; i < sector_count; i++) {
for (size_t f = 0; f < 4; f++) {
/*once message written fill rest of sector with 0x00*/
if((i * 4 )+ f > encoded_size) {
write_data[f] = 0x00;
}
else {
write_data[f] = tlv_data[(i * 4) + f];
}
}
ntag21x_write(tag, block[i], write_data);/*takes an array with exactly 4 bytes and writes it to given address on given tag*/
}
return 1;
}
程序输出为:
这可能与我分割数据的方式有关,但我无法弄清楚如何。
最后一个(本例中为第3个)数据块读取:0x67,0x6c,0xfe,0xff(而不是0x00)。
答案 0 :(得分:1)
您到达编码数据末尾的测试是关闭的。
((i * 4) + f) > encoded_size
这仅从TLV编码数据结束后的第二个字节开始(例如,如果encoded_data == 0
,则i = 0
,f = 1
的测试仍为假。< / p>
因此,您需要将此条件修改为
if (((i * 4) + f) >= encoded_size) {
write_data[f] = 0x00;
} else {
write_data[f] = tlv_data[(i * 4) + f];
}