typedef union
{
uint ui[4];
} md5hash;
void main(void)
{
int opt;
while ((opt = getopt(argc, argv, "c:t:s:h:")) != -1) {
switch (opt) {
case 'h':
hash = optarg;
break;
default: /* '?' */
exit(EXIT_FAILURE);
}
}
md5hash hash;
sscanf(hash, "%x%x%x%x", &hash.ui);
}
./ program -h fffffffffffffffffffffffffffffffff
我想做上述事情,但sscanf不能正确接受md5sum ......
答案 0 :(得分:5)
sscanf
语句尝试将hash
重新读回自身,但显然它不会找到任何十六进制数字。%x
可能会在不同平台上以十六进制加载不同大小的整数,因为您没有为每个字段指定任何特定长度。如果你有一个十六进制字符串,让我们说在hashString
然后你可以尝试
int fieldsScanned = sscanf (hashString, "%8x%8x%8x%8x", &hash.ui[0], &hash.ui[1], &hash.ui[2], &hash.ui[3]);
if (fieldsScanned == 4)
{
// MD5 sum is in hash variable.
}
答案 1 :(得分:0)
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()方法不起作用,它在双字中以相反的顺序读取字节。