int
parse_hex(char *s, unsigned char *hex, int len)
{
int i, r = 0;
len *= 2;
for (i = 0; ; i++, s++)
{
if (*s == 0 && !(i & 1))
return i / 2;
if (i == len)
{
fprintf(stderr, "parsehex: string too long\n");
//exit(1);
}
if (*s >= '0' && *s <= '9')
r = (r << 4) | (*s - '0');
else if (*s >= 'a' && *s <= 'f')
r = (r << 4) | (*s - ('a' - 10));
else if (*s >= 'A' && *s <= 'F')
r = (r << 4) | (*s - ('a' - 10));
else
{
fprintf(stderr, "parsehex: bad string\n");
//exit(1);
}
if ((i & 1) != 0)
{
hex[i / 2] = r;
r = 0;
}
}
}
void
parse_md5(char *s, unsigned char *md5)
{
if (!*s)
{
memset(md5, 0, 16);
return;
}
if (parse_hex(s, md5, 16) != 16)
{
fprintf(stderr, "parsemd5: bad md5\n");
//exit(1);
}
}
на самом деле вышеприведенный метод sscanf () не работает, он читает байты в обратном порядке внутри двойных слов.