如何从字符串中获取十六进制值?

时间:2018-03-17 22:28:51

标签: c hex

我有一个带输入参数的函数" text" ,由一个字符串组成,该字符串包含由空格分隔的未知数量的2个字符的十六进制数字。我需要读取它们并将它们放在单独的数组索引中或者在for循环中读取它们并逐个使用它们。这些值中的每一个都表示加密的char(十六进制值是字符的ascii值)。我怎么能这样做?我想我应该使用sscanf();但我无法弄清楚如何做到这一点。

char* bit_decrypt(const char* text){
    int size=strlen(text)/3;
    unsigned int hex[size];
    char*ptr;
    for(int i=0; i<size+1; i++){
        hex[i] = strtoul(text, &ptr, 16);
        printf("%x ",hex[i]);
    }
    return NULL;
}
output is: "80 80 80 80 80 80 80 80 80 80 80 80"
should be: "80 9c 95 95 96 11 bc 96 b9 95 9d 10"

2 个答案:

答案 0 :(得分:0)

您始终扫描text的第一个值,因为您忘记在上一次扫描结束后立即移动strtoul的输入。这就是**end - strtoul参数的优点:它指向成功扫描的最后一位数后面的字符。注意:如果没有读入任何内容,则end - 指针与输入指针相等,这表示“格式错误编号”或字符串结尾。请参阅以下程序说明这一点。希望它有所帮助。

int main() {

    const char* input = "80 9c 95 95 96 11 bc 96 b9 95 9d 10";
    const char *current = input;
    char *end = NULL;
    while (1) {
        unsigned long val = strtoul(current, &end, 16);
        if (current == end) // invalid input or end of string reached
            break;

        printf("val: %lX\n", val);

        current = end;
    }
}

答案 1 :(得分:0)

这也是使用strchrstrtoul(tmp,NULL,16);

的可能解决方案

在您的解决方案中,请记住size_t arr_len = (len/3) + 1;,因为最后一个令牌只有2个字节。

输入text令牌将转换为字节并存储在char array

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  char text[] = "80 9c 95 95 96 11 bc 96 b9 95 9d 10";

  size_t len = strlen(text);
  size_t arr_len = (len/3) + 1;

  printf("len= %zu arr_len= %zu\n", len, arr_len);
  printf("Text:\n%s\n", text);

  char array[arr_len];
  const char *p1 = text;

  char tmp[3];
  tmp[2] = 0;

  printf("Parsing:\n");     
  for(size_t i=0; i< arr_len; i++)
  {
       p1 = strchr(p1,' ');

       if(p1)
       {
           tmp[0] = *(p1-2);
           tmp[1] = *(p1-1);

           array[i]= (char)strtoul(tmp,NULL,16);
           printf("%2x ", (unsigned char) array[i]);

           p1++;

           if(strlen(p1) == 2 ) // the last char
           {
               i++;

               tmp[0] = *(p1);
               tmp[1] = *(p1+1);

               array[i]= (char)strtoul(tmp,NULL,16);
               printf("%2x", (unsigned char) array[i]);
           }
       }
  }

  printf("\nArray content:\n"); 
  for(size_t i=0; i< arr_len; i++)
  {
    printf("%2x ", (unsigned char) array[i]);  
  }

  return 0;
}

测试:

len= 35 arr_len= 12
Text:
80 9c 95 95 96 11 bc 96 b9 95 9d 10
Parsing:
80 9c 95 95 96 11 bc 96 b9 95 9d 10
Array content:
80 9c 95 95 96 11 bc 96 b9 95 9d 10