Как мне принять md5sum через командную строку в C? - PullRequest
1 голос
/ 09 декабря 2008
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 ffffffffffffffffffffffffffffffff

Я хочу сделать выше, но sscanf не принимает md5sum должным образом ...

Ответы [ 2 ]

5 голосов
/ 09 декабря 2008
  1. Похоже, у вас есть две переменные, называемые хэш, за исключением одной неявной в вашем коде.
  2. Оператор sscanf пытается прочитать hash обратно в себя, но, очевидно, он не найдет никаких шестнадцатеричных цифр.
  3. %x может загружать целое число другого размера в шестнадцатеричном формате на разных платформах, поскольку вы не указали какую-либо конкретную длину для чтения для каждого поля.
  4. Вы не учитываете порядковый номер машины.

Если у вас есть шестнадцатеричная строка, скажем, в 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.
}
0 голосов
/ 09 декабря 2008
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 () не работает, он читает байты в обратном порядке внутри двойных слов.

...