J'ai écrit une fonction pour prendre les données d'un lecteur Sirit IDitity MaX AVI et analyser le code d'installation et le numéro de carte-clé. Comment je le fais actuellement fonctionne, mais y a-t-il un meilleur moyen? Semble peu hackish ... buff & buf sont de taille 264Convertir Hex Char en Int - Y at-il un meilleur moyen?
buf
et buff
sont carboniser
Les données reçues du lecteur:
2009/12/30 14:56:18 epc0 LN:001 C80507A0008A19FA 0000232F Xlat'd
char TAccessReader::HexCharToInt(char n)
{
if (n >= '0' && n <= '9')
return (n-'0');
else
if (n >= 'A' && n <= 'F')
return (n-'A'+10);
else
return 0;
}
bool TAccessReader::CheckSirit(char *buf, long *key_num, unsigned char *fac) {
unsigned short i, j, k;
*key_num = 0; // Default is zero
memset(buff, 0, sizeof(buff));
i = sscanf(buf, "%s %s %s %s %s %s %s", &buff[0], &buff[20], &buff[40],
&buff[60], &buff[80], &buff[140], &buff[160]);
if (i == 7 && buff[147] && !buff[148]) {
// UUGGNNNN UU=spare, GG=Facility Code, NNNN=Keycard Number (all HEX)
// get facility code
*fac = HexCharToInt(buff[142]) * 16 + HexCharToInt(buff[143]);
*key_num = (unsigned short)HexCharToInt(buff[144]) * 4096 +
(unsigned short)HexCharToInt(buff[145]) * 256 +
(unsigned short)HexCharToInt(buff[146]) * 16 +
HexCharToInt(buff[147]);
}
// do some basic checks.. return true or false
}
Quel est le format de buf? –
Vous pouvez utiliser 'strtoul()' dans la bibliothèque standard C. –
'strtol' et' strtoul' sont mes fonctions préférées pour cela parce qu'ils sont si flexibles. Ils peuvent faire hex, décimal, octal et binaire (n'importe quelle base de 2 à 36, vraiment), et si vous dites base 0, ils vont utiliser des préfixes de style C ('0' pour octal,' 0x' pour hex, pas de préfixe pour décimal) pour comprendre la base. Idéal pour les paramètres d'analyse. La seule chose qu'ils ne font pas est la base 64. –