【发布时间】:2010-12-31 04:40:45
【问题描述】:
我编写了一个函数来从 Sirit IDentity MaX AVI 阅读器中获取数据并解析出设施代码和钥匙卡号。我目前的工作方式如何,但有更好的方法吗?似乎有点 hackish...buff 和 buf 的大小为 264
buf 和 buff 是字符
从阅读器收到的数据:
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
}
【问题讨论】:
-
您可以使用 C 标准库中的
strtoul()。 -
strtol和strtoul是我最喜欢的函数,因为它们非常灵活。他们可以使用十六进制、十进制、八进制和二进制(实际上是从 2 到 36 的任何基数),如果你说以 0 为基数,他们将使用 C 风格的前缀(0表示八进制,0x表示十六进制,小数点没有前缀)来计算基数。非常适合解析参数。他们唯一不做的是base 64。