如果给我一个字符串“ 192f3c”,如何处理该字符串,以便能够将其读取为十六进制值“ 19”,“ 2f”和“ 3c”?

我在用C编程

////////////////////////////

对困惑感到抱歉。希望这会澄清。
我正在尝试将哈希值与给定的哈希值进行比较。

int main(int argc, char *argv[]) {
    /* hashing done here with sha1 and stored in "value" */

    if (argv[1] == value) {
        printf("%s\n", "hash matches");
    } else {
        printf("%s\n", "hash fails");
    }

    return 0;
}


因此,总的要点是如果执行“ ./a.out 3f3c”,它将告诉我哈希值是否与输入值匹配。

当我尝试将字符串与十六进制的实际哈希值进行比较时,就会出现问题。因此,我试图弄清楚如何转换一个或另一个,以便可以对两者进行比较。

最佳答案

隔离每2个字符的一种非常简单且基本的方法是声明一个指向您输入的指针并保留一个计数器。您可以使用模%运算符仅对每个其他字符起作用,从而使每2个字符隔离一次。您可以对sscanf使用相同的逻辑,以将每个十六进制字节读取为数字值或值数组。下面给出了两个示例:

#include <stdio.h>

int main (int argc, char **argv) {

    /* check for required input */
    if (argc < 2 ) {
        fprintf (stderr, "error: insufficient input, usage: %s <string of hex vals>\n", argv[0]);
        return 1;
    }

    char *p = argv[1];
    unsigned val = 0;
    size_t n = 1;

    printf ("\n Original string: %s\n\n", argv[1]);

    /* print every 2 characters */
    while (*p) {
        if (n % 2 == 0)
            printf ("   %c%c\n", *(p-1), *p);
        n++;
        p++;
    }

    printf ("\n As unsigned values:\n\n");

    p = argv[1];
    n = 1;
    /* read every hex bytes into values using sscanf */
    while (*p) {
        if (n % 2 == 0) {
            sscanf (p-1, "%2x", &val);
            printf ( "   0x%2x\n", val);
        }
        n++;
        p++;
    }

    return 0;
}


输出量

$ ./bin/str2hexpairs 192f3c

 Original string: 192f3c

   19
   2f
   3c

 As unsigned values:

   0x19
   0x2f
   0x3c


注意:无论是打印还是读取值,使用指针解析十六进制对时,您始终将读取两个字符(有效读取一个十六进制字节),然后使用指针位置p - 1打印或填充您的无符号值。这是为了防止在您有奇数个字符(字符串的末尾少于完整的十六进制字节)的情况下无意中读取超出字符串末尾的内容

10-04 21:55
查看更多