【问题标题】:How do I cast a string so that I can read the string as hex values?如何转换字符串以便可以将字符串读取为十六进制值?
【发布时间】:2015-04-16 03:01:18
【问题描述】:

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

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

【问题讨论】:

  • 一次获取两个字符,放入另一个字符串?
  • 有没有办法将这两个当前是字符串的字符视为十六进制值?
  • 你应该向我们展示你到目前为止编写的代码并解释错误在哪里。不过,您正在寻找的功能是 sscanf()
  • 您想要这样的打印输出:"19 2F 3C" ... 每个字节用空格分隔吗?
  • 从示例输入 ("192f3c") 你想要三个 字符串 每个包含两个字符,还是想要三个 整数 (@987654324 @、intunsigned 等)?你的用例是什么?你打算如何处理这三个独立的“数字”?

标签: c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

          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

      【讨论】:

        猜你喜欢
        • 2013-02-07
        • 2019-07-27
        • 2018-08-20
        • 1970-01-01
        • 2017-06-16
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        相关资源
        最近更新 更多