Ошибка разделения данных NDEF - PullRequest
0 голосов
/ 08 мая 2018

Я написал небольшую функцию для форматирования необработанных данных в 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;
}

Вывод программы:

image

Возможно, это как-то связано с тем, как я разделяю данные, чтобы записать их, но я просто не могу понять, как.

Последний (в данном случае третий) блок данных читает: 0x67, 0x6c, 0xfe, 0xff (вместо 0x00, как должно).

1 Ответ

0 голосов
/ 10 мая 2018

Ваш тест для достижения конца закодированных данных отключен на один.

((i * 4) + f) > encoded_size

Это верно только для второго байта после окончания закодированных данных TLV (например, если encoded_data == 0, проверка все равно будет ложной для i = 0, f = 1).

Следовательно, вам нужно изменить это условие на

if (((i * 4) + f) >= encoded_size) {
    write_data[f] = 0x00;
} else {
    write_data[f] = tlv_data[(i * 4) + f];
}
...