如何转换字符串以便我可以将字符串读取为十六进制值?

时间:2015-04-16 03:01:18

标签: c

如果给我一个字符串“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”它会告诉我散列值是否与输入值匹配。

当我尝试将字符串与十六进制的实际哈希值进行比较时,会出现

问题。所以我试图想出如何转换一个或另一个,以便我可以比较两者。

3 个答案:

答案 0 :(得分:1)

如果您正在寻找库函数,请使用stdlib.h中的atoh

答案 1 :(得分:0)

试试这个:(在极少数情况下我会收到错误。但大多数情况下都有效)。我感谢对此代码的更正:

    int ascii_to_hex (char c)
{
    int num = (int) c;
    if (num < 58 && num > 47)
    {


        return num - 48;
    }
    if (num < 103 && num > 96)
    {


        return num - 87;
    }
    return num;
}


int main ()
{

    unsigned char a[] = "192f3c";
    unsigned char *hex_arr;
    int i,j;
    char c;
    int sum;
    unsigned char c1,c2;

    hex_arr = malloc (sizeof (a)/2);

    j = 0;
    for (i = 0; i < sizeof (a) ; i = i+2)
    {
        c1 = ascii_to_hex (a[i]);
        c2 = ascii_to_hex (a[i+1]);
        sum = c1 << 4 | c2;
        hex_arr[j] = sum;
        j++;
    }

    printf("Array in hex\n");

    for (i = 0; i < sizeof (a)/2 ; i++)
        printf("%.2X ",hex_arr[i]);


    printf("\n");
}

O / P:

  
    

十六进制数组

         

19 2F 3C

  

答案 2 :(得分:0)

隔离每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的值。这是为了防止在你有一个奇数个字符(在你的字符串末尾少于一个完整的十六进制字节)的情况下无意中读取超出字符串结尾的内容。