1
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をちゃんと受け付けない...

4

2 に答える 2

5
  1. コードに暗黙的に含まれているものを除いて、ハッシュと呼ばれる2つの変数があるようです。
  2. ステートメントはそれ自体sscanfに読み戻そうとしますhashが、明らかに16進数は検出されません。
  3. %x各フィールドで読み取る特定の長さを指定していないため、異なるプラットフォームで異なるサイズの整数を16進数でロードする場合があります。
  4. マシンのエンディアンを考慮していません。

16進文字列がある場合は、たとえば、次のように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.
}
于 2008-12-09T01:59:09.073 に答える
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()メソッドは機能せず、ダブルワード内で逆の順序でバイトを読み取ります。

于 2008-12-09T06:38:32.863 に答える