我有这个功能:
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