我有这个功能:

char *ctohex(char *str){
    int i=0, len;
    len = strlen(str);
    char *final = malloc(len*2*sizeof(char)+1);
    while(len--){
         sprintf(final+i*2, "%02X", str[i]);
         i++;
    }
    return final;
}


现在我想要一个从十六进制到普通字符的反向函数,这可能吗?对不起我的英语。没有人给我一个很好的答案,也许我解释错了。

我在功能上有此输入:
JOAO
输出为:
4A4F414F

我想将4A4F414F放回JOAO

最佳答案

与原始ctohex()几乎完全相反

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

char *hextoc(const char *str) {
  size_t i, j, len;
  len = strlen(str);

  // If the length is not even
  if (len % 2)
    return NULL;

  char *final = malloc(len/2 + 1);
  if (final == NULL)
    return NULL;

  j = 0;
  for (i = 0; i < len; i += 2) {
    if (!isxdigit((unsigned char) str[i])
            || !isxdigit((unsigned char) str[i+1])) {
      free(final);
      return NULL;
    }
    unsigned x;
    sscanf(&str[i], "%2X", &x);
    final[j++] = (char) x;
  }
  final[j] = '\0';
  return final;
}

int main() {
  return puts(hextoc("4A4F414F"));
  // prints JOAO
}




ctohex(char *str)有问题。当str[i]
// sprintf(final+i*2, "%02X", str[i]);
sprintf(final+i*2, "%02X", str[i] & 0xFF);
// or
sprintf(final+i*2, "%02hhX", str[i]);  // Current C compilers

09-07 19:32