2014-04-13 130 views
-2

*上下文:我想要使用libnfc從Mifare卡測試Uid。我已經被拆開這個例子:http://nfc-tools.org/index.php?title=Libnfc:quick_start_example *C中的十六進制比較

print_hex是在連接例如頂部的輔助功能,它是這樣的:

print_hex(const uint8_t *pbtData, const size_t szBytes) 
{ 
    size_t szPos; 

    for (szPos = 0; szPos < szBytes; szPos++) { 
    printf("%02x ", pbtData[szPos]); 
    } 
    printf("\n"); 
} 

我可以輸出這樣的卡的UID:

print_hex(nt.nti.nai.abtUid, nt.nti.nai.szUidLen); 

而這就是我得到:

9f d8 a2 00 

我想比較這agains TA儲值,是這樣的:

if (*nt.nti.nai.abtUid == 0x9fd8a200) { 

但給我的警告:

reader.c:81:28: warning: comparison of constant 2681774592 with expression of type 'uint8_t' (aka 'unsigned char') is always false [-Wtautological-constant-out-of-range-compare] 
    if (*nt.nti.nai.abtUid == 0x9fd8a200) { 
     ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~ 

如果我更改爲:

if ((int)*nt.nti.nai.abtUid == 0x9fd8a200) { 

它編譯但不匹配,如果我改爲:

if (nt.nti.nai.abtUid == 0x9fd8a200) { 
    printf("Winner\n"); 
} 

它給出了一個警告:

reader.c:81:27: warning: comparison between pointer and integer ('uint8_t *' (aka 'unsigned char *') and 'unsigned int') 
    if (nt.nti.nai.abtUid == 0x9fd8a200) { 

援助讚賞!

編輯

這是什麼工作:

const uint8_t winner[] = { 0x9f, 0xd8, 0xa2, 0x00}; 
if (memcmp(nt.nti.nai.abtUid, winner, 4) == 0) { 
    printf("Winner\n"); 
} 
+1

看看'memcmp()' – Deduplicator

+0

@Deduplicator我可以使用memcmp()當一個對象是不是指針?你能給個例子嗎?此外,字節數可能會改變。 – SimonJGreen

+0

顯然你需要使用'print_hex'或其他方法將兩者轉換爲相同的格式。甚至可能在編譯時/之前。 – Deduplicator

回答

0

取決於如何對你要比較的ID被存儲。 這個:

0x9fd8a200 

現在只是一個4字節的整數。但你說過。的字節可以改變?

這是最好的,我想如果你對存儲要比較的字節數組,例如標識,

const uint8_t id[] = { 0x9f, 0xd8, 0xa2, 0x00}; 

那麼你可以memcmp這與abtUid

+0

謝謝,排序。現在正在討論最後的工作。 – SimonJGreen

+1

@SimonJGreen:不錯,如果有幫助。你也可以用一個7字節的數組初始化id [] - 並使用memcmp,我認爲mifare的一些ID也是7個字節長。 –

3
if ((int)*nt.nti.nai.abtUid == 0x9fd8a200) { 

這仍然是一個8位的數量,而是轉化爲int。您需要的是以4x8位的數量訪問該區域。這可以通過打字(例如,BLUEPIXY建議的內容)完成,但不能保證(在您的代碼中可見)abtUid適合32位內存訪問。在某些處理器上,這可能會導致總線錯誤。可以使用memcmp()來比較Uid。例如:

memcmp (nt.nti.nai.abtUid, "\x9f\xd8\xa2\x00", 4) 
+0

謝謝,雖然dmcr_code第一次到達那裏 – SimonJGreen