比较C中的十六进制

时间:2014-04-13 21:26:49

标签: c if-statement types nfc

*上下文:我想使用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");
 }

2 个答案:

答案 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};

然后,你可以memcmpabtUid进行{{1}}。

相关问题