2015-12-17 27 views

回答

0

您將需要閱讀的鎖位,以便對它們進行分析,以找出是否某些網頁被標記爲只讀:

boolean isPageLocked(MifareUltralight tag, int page) { 
    if (page < 2) { 
     // UID pages 
     return true; // pages 0..1 are always read-only 
    } else if (page < 3) { 
     // static lock bytes page 
     final byte[] data = tag.readPages(page); 
     final int lockBits = ((data[2] & 0x0ff) << 8) | (data[3] & 0x0ff); 
     if ((lockBits & 0x007) == 0x007) { 
      return true; 
     } else { 
      // page is partially writable 
      return false; 
     } 
    } else if (page < 16) { 
     // OTP and user data (lockable through lockbits in page 2) 
     final byte[] data = tag.readPages(page); 
     final int lockBits = ((data[2] & 0x0ff) << 8) | (data[3] & 0x0ff); 
     return (lockBits & (1<<page)) != 0; 
    } else if (page < 40) { 
     // extended user data (lockable through lockbits in page 40) 
     // valid for MIFARE Ultralight C and NTAG203 (not applicable for EV1 products!) 
     final byte[] data = tag.readPages(40); 
     final int lockBits = ((data[0] & 0x0ff) << 8) | (data[1] & 0x0ff); 

     final int relPage = (page - 16)/4; 

     if (relPage < 3) { 
      return (lockBits & (1<<(relPage+9))) != 0; 
     } else { 
      return (lockBits & (1<<(relPage+10))) != 0; 
     } 
    } else { 
     return false; // unknown 
    } 
} 

你寫在標籤之前然後,您可以使用此方法:

int pageNumber = ... 
byte[] pageData = ... 
if (!isPageLocked(tag, pageNumber)) { 
    tag.writePage(pageNumber, pageData); 
} 

注意的是,上述方法(isPageLocked())不會因爲擴展鎖字節佈局EV1產品在MIFARE超輕和NTAG產品線(例如超輕EV1或NTAG21x)工作對他們來說是不同的。