尝试解析十六进制字符串时崩溃

时间:2016-10-01 18:47:06

标签: c

我有一个hex字符串,格式为“404C49474854”。 我试图用以下方法从中提取文本字符串:

void  textFromHexString(char *hex,char *result)
{

    for(int k=1;k<strlen(hex);k+=2)
    {
         char temp[3]={0};
        sprintf(temp,"%c%c",hex[k-1],hex[k]);
        *result=char((int)strtol(temp, NULL, 16));
         result++;
        *result ='\0';
         print(temp);   //**** edit

    }

}

我从另一个函数中调用它,使用:

void somefunction()
{
            // I have p here, which prints "404C49474854"
           char text[TEXT_MAX_SIZE]={0};
            textFromHexString(p,text);
}

它有效,但 80%的时间都有效。在某些情况下它会崩溃,其中:

-incoming hex指针是:"404C49474854"肯定。

- 指针temp获得一个甚至不在hex内的其他值。

这种方法有什么问题吗?

修改 检查在循环内打印的行的位置,它将在非常特定的情况下打印出来:

4Hello, world

仅由数字组成的temp如何获取此字符串? (“Hello world”,只是我在程序开头打印的字符串,也是临时大小为3)

2 个答案:

答案 0 :(得分:0)

您可以使用sscanf()直接读取给定长度的十六进制数字,如下所示:

while(hex[0] && hex[1]) {
  int value;
  sscanf(hex, "%2x", &value);
  printf("%c", value);
  hex += 2;
}
printf("\n");

答案 1 :(得分:0)

似乎评论者发现了大多数错误,所以这里的代码可以假设我猜对了你想要的东西。

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

// ALL CHECKS OMMITTED!

void textFromHexString(char *hex, char result[])
{
  // work on copy
  char *p = result;

  // this has more steps than necessary for clarity
  for (size_t k = 1; k < strlen(hex); k += 2) {
    // normalize input
    char first = tolower(hex[k - 1]);
    char second = tolower(hex[k]);
    // convert hexbyte to decimal number
    int f1 = (isdigit(first)) ? first - '0' : (first - 'a') + 10;
    int f2 = (isdigit(second)) ? second - '0' : (second - 'a') + 10;
    // two byte number from LSB hex to decimal (e.g.: "ab" = 171)
    int num = f1 * 16 + f2;
    // needs to store min. 3 characters plus NUL
    char temp[4] = { 0 };
    // sprintf is a bit too much for it but simple
    sprintf(temp, "%d", num);
    // concatenate temp to the result-string
    strcat(p, temp);
    // For debugging, I guess, or further work?
    printf("%s\n", temp);
  }
}

#define TEXT_MAX_SIZE 64
int main()
{
  // 0x404C49474854 = 70696391100500
  char *p = "404C49474854";
  // allocate some scratchspace on the stack
  char text[TEXT_MAX_SIZE] = { 0 };

  textFromHexString(p, text);
  // the function textFromHexString() does it in chunks of two bytes,
  // so the result is 647673717284 here
  printf("Result: %s\n", text);

  exit(EXIT_SUCCESS);
}