*上下文:我想使用libnfc从Mifare卡测试Uid。我拆开了这个例子:http://nfc-tools.org/index.php?title=Libnfc:quick_start_example *
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
我想将其与存储值进行比较,例如:
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");
}
答案 0 :(得分: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)
答案 1 :(得分:0)
取决于您要比较的ID的存储方式。 这样:
0x9fd8a200
现在只是一个4字节的整数。但是你说nr。字节可以改变吗?
我认为最好将您要比较的ID存储为字节数组,例如
const uint8_t id[] = { 0x9f, 0xd8, 0xa2, 0x00};
然后,你可以memcmp
与abtUid
进行{{1}}。