我有一个读卡器,它总是报告64位,并且可以读取带有4或7字节UID的卡片。
例如,我认为它可以报告:
04-18-c5-82-00-00-00-00
-表单uid0-uid1-uid2-uid3-00-00-00-00
中的4字节UID。04-18-c5-82-f1-3b-81-00
-表单uid0-uid1-uid2-uid3-uid4-uid5-uid6-00
中的7字节UID。是什么使7字节的UID不能将uid4、uid5和uid6设置为零?这上面有规格说明吗?如果是,哪种规格?
发布于 2016-06-24 09:15:38
是什么使7字节的UID不能将uid4、uid5和uid6设置为零?
没什么。UID的格式(由MIFARE卡使用)是在ISO/IEC 14443-3中定义的.专门为MIFARE卡,NXP有(或至少有?)对于4字节UID,还有一些进一步的分配逻辑,但这是不可公开的。
能区分这两种情况吗?
如果读取器准确地以示例中显示的形式输出UID,则答案是“否”(至少不是可靠的)。然而,一些阅读器输出8字节的UID,并包含7字节-UID的级联标记。因此,对于这些读取器,所有的7字节-UID都以0x88开头.你的读者似乎不是这样的。
是否有可能将这两种情况区分开来?
我想到了一些区分4字节UID和7字节UID的策略.
发布于 2016-07-05 22:02:22
如果您能够得到ATQA响应,您可以区分它。ATQA的下一个字节显示了UID的长度。(4/7/10 10Byte)据我所知,没有其他方法可以用100%的保证来区分
br
发布于 2019-10-04 18:40:00
我知道派对有点晚了,但是对于任何有同样疑问的人来说,在4位字节UID中创建一个7字节UID的记录方式在这个pdf格式的附件-6中。
万一这一页掉了下来,下面会给出一张厚颜无耻的翻版。如果您在下面的代码片段中发现任何和所有错误,都应该属于NXP人员,而不是我。
,但是您如何知道标记是4字节还是7字节?
来自ATQA的回应。参考文件1的第15/36页和2文档的第8/15页。
如果文档发生故障,下面是文档1的相关摘录。
MF1S50yX/V1使用表11所示的ATQA或WUPA命令和表12中所示的SAK值(7字节UID变量的CL1命令CL2)回答。 注:第7和第8位中的ATQA编码表明根据ISO/IEC 14443的UID大小,与UID使用的设置无关。
6.附件,从双码UID派生NUID的源代码
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define BYTE unsigned char
unsigned short UpdateCrc(unsigned char ch, unsigned short *lpwCrc)
{
ch = (ch^(unsigned char)((*lpwCrc) & 0x00FF));
ch = (ch^(ch<<4));
*lpwCrc = (*lpwCrc >> 8)^((unsigned short)ch << 8)^((unsigned
short)ch<<3)^((unsigned short)ch>>4);
return(*lpwCrc);
}
void ComputeCrc(unsigned short wCrcPreset, unsigned char *Data, int
Length, unsigned short &usCRC)
{
unsigned char chBlock;
do {
chBlock = *Data++;
UpdateCrc(chBlock, &wCrcPreset);
} while (--Length);
usCRC = wCrcPreset;
return;
}
void Convert7ByteUIDTo4ByteNUID(unsigned char *uc7ByteUID, unsigned char
*uc4ByteUID)
{
unsigned short CRCPreset = 0x6363;
unsigned short CRCCalculated = 0x0000;
ComputeCrc(CRCPreset, uc7ByteUID, 3,CRCCalculated);
uc4ByteUID[0] = (CRCCalculated >>8)&0xFF;//MSB
uc4ByteUID[1] = CRCCalculated &0xFF; //LSB
CRCPreset = CRCCalculated;
ComputeCrc(CRCPreset, uc7ByteUID+3, 4,CRCCalculated);
uc4ByteUID[2] = (CRCCalculated >>8)&0xFF;//MSB
uc4ByteUID[3] = CRCCalculated &0xFF; //LSB
uc4ByteUID[0] = uc4ByteUID[0]|0x0F;
uc4ByteUID[0] = uc4ByteUID[0]& 0xEF;
}
int main(void)
{
int i;
unsigned char uc7ByteUID[7] =
{0x04,0x18,0x3F,0x09,0x32,0x1B,0x85};//4F505D7D
unsigned char uc4ByteUID[4] = {0x00};
Convert7ByteUIDTo4ByteNUID(uc7ByteUID,uc4ByteUID);
printf("7-byte UID = ");
for(i = 0;i<7;i++)
printf("%02X",uc7ByteUID[i]);
printf("\t4-byte FNUID = ");
for(i = 0;i<4;i++)
printf("%02X",uc4ByteUID[i]);
getch();
return(0);
}
https://stackoverflow.com/questions/37837730
复制相似问题