前面已經提到,想要把5個字節的long
它只能存儲4個字節內。此外,你必須使用結構:
struct RFIDTagId
{
unsigned long low;
unsigned long high; // can also be unsigned char
};
並使用類似的東西:
unsigned int hex2int(char c)
{
if (c >= 'A' && c <= 'F')
return (c - 'A' + 0x0A);
if (c >= '0' && c <= '9')
return c - '0';
return 0;
}
void char2Id(char *src, RFIDTagId *dest)
{
int i = 0;
dest->low = 0;
for(i = 0; i < 8; ++i)
{
dest->low |= hex2int(src[i]) << (i*4);
}
dest->high = 0;
for(i = 8; i < 10; ++i)
{
dest->high |= hex2int(src[i]) << ((i-8)*4);
}
}
,並比較2個IDS:
int isRFIDTagIdIsEqual(RFIDTagId * lhs, RFIDTagId * rhs)
{
return lhs->low == rhs->low && lhs->high == lhs->high;
}
,或者如果你真的有C++:
bool operator==(RFIDTagId const & lhs, RFIDTagId const & rhs)
{
return lhs.low == rhs.low && lhs.high == lhs.high;
}
甚至10個十六進制數字[0-9A-F]將是5個字節,因此更多比一個「長」。 – SpamBot
您可以將2個第一個值合併到一個int中,並將最後8個值合併爲一個long,然後與邏輯和兩個變量進行比較,但我確信額外的代碼會更多不僅僅是一個'strcmp',而且更復雜。 – AntonH
@AntonH同樣,如果你把'int'和'long'放入同一個結構中,由於內存對齊的原因,這可能需要整個8個字節。 (我不知道Arduino的工作原理)。 –