我们的团队为Ingenico设备上的NFC卡开发POS解决方案。 我们用什么来读卡片:
/* Open the MIFARE driver */
int ClessMifare_OpenDriver (void);
Return value: OK
/*Wait until a MIFARE contactless card is detected*/
int ClessMifare_DetectCardsEx (unsigned char nKindOfCard, unsigned int *pNumOfCards, unsigned int nTimeout);
Return value: OK
/*Retrieve the type of the MIFARE card and its UID */
int ClessMifare_GetUid (unsigned char nCardIndex, unsigned char *pKindOfCard, unsigned char *pUidLength, unsigned char *pUid);
返回值:
Paramater2:
pKindOfCard(Type of cards)
Card1: CL_B_UNDEFINED
Card2: CL_B_UNDEFINED
Card3: CL_B_UNDEFINED
Card4: CL_MF_CLASSIC
Paramater4: pUid ( UID of the card)
Card1: "\004Br\302\3278\200"
Card2: "\004\333\354y\342\002\200"
Card3: "\004s\247B\344?\201"
Card4: "\016\310d\301"
但在现实生活中我们期望:
Card1 044272c2d73880
Card2 0ec864c1
Card3 0473a742e43f81
Card4 04dbec79e20280
从Android NFC阅读器我们得到正确的数字,但是从它与Ingenico POS的输出完全不同。我们需要做什么才能将这个数字用十六进制表示?
谢谢!
答案 0 :(得分:3)
您实际上是在这里看到正确的UID。只有一个你不期望的代表问题。您引用的返回值是C字符串,八进制转义为不可打印的字符。 \nnn
是一个字节的八进制表示。
在值"\004s\247B\344?\201"
中,您有\004
,值为0x04的字节,后跟可打印字符s
,值为0x73,后跟\247
,值为0xa7,等
您可以转换为十六进制以便使用python进行调试,例如:
$ python2
>>> import binascii
>>> binascii.b2a_hex("\004Br\302\3278\200")
'044272c2d73880'
>>> binascii.b2a_hex("\004\333\354y\342\002\200")
'04dbec79e20280'
>>> binascii.b2a_hex("\004s\247B\344?\201")
'0473a742e43f81'
>>> binascii.b2a_hex("\016\310d\301")
'0ec864c1'
但总体而言,数据就在这里。